更好的ArrayField管理小部件?

Dan*_*nra 24 django django-admin

有没有办法让ArrayField的管理窗口小部件允许添加和删除对象?似乎默认情况下,它只显示一个文本字段,并使用逗号分隔作为其值.

除了不方便之外,AFAICT在数组的基本字段是Char/TextField的情况下,这不允许在数组的任何文本中包含逗号的任何方式.

rop*_*ble 25

我不赞成这个(原始来源),但更简单的选择是ArrayField在模型上继承并覆盖默认的管理小部件.接下来是一个基本实现(在Django 1.9和1.10中测试):

models.py

from django import forms
from django.db import models
from django.contrib.postgres.fields import ArrayField


class ChoiceArrayField(ArrayField):
    """
    A field that allows us to store an array of choices.
    Uses Django's Postgres ArrayField
    and a MultipleChoiceField for its formfield.
    """

    def formfield(self, **kwargs):
        defaults = {
            'form_class': forms.MultipleChoiceField,
            'choices': self.base_field.choices,
        }
        defaults.update(kwargs)
        # Skip our parent's formfield implementation completely as we don't
        # care for it.
        # pylint:disable=bad-super-call
        return super(ArrayField, self).formfield(**defaults)


FUNCTION_CHOICES = (
    ('0', 'Planning'),
    ('1', 'Operation'),
    ('2', 'Reporting'),
)


class FunctionModel(models.Model):
    name = models.CharField(max_length=128, unique=True)
    function = ChoiceArrayField(
        base_field=models.CharField(max_length=256, choices=FUNCTION_CHOICES),
        default=list)
Run Code Online (Sandbox Code Playgroud)

  • 我错过了什么吗?您实际上在哪里覆盖默认管理小部件?你从博客中引用的片段将相当有限的 ArrayField 变成了有用的东西并且效果很好。但是,很高兴看到您发现哪个管理小部件充分利用了这一点。我可能会试一试 Select2。 (3认同)
  • 我已将示例扩展为更完整. (2认同)
  • 解决方案仅适用于 CharField。对于其他类型,请检查此 https://gist.github.com/danni/f55c4ce19598b2b345ef#gistcomment-2058176 (2认同)

小智 11

这是已接受的解决方案的更好版本。使用“CheckboxSelectMultiple”使其在管理页面中更有用。

class ChoiceArrayField(ArrayField):

    def formfield(self, **kwargs):
        defaults = {
            'form_class': forms.TypedMultipleChoiceField,
            'choices': self.base_field.choices,
            'coerce': self.base_field.to_python,
            'widget': forms.CheckboxSelectMultiple,
        }
        defaults.update(kwargs)

        return super(ArrayField, self).formfield(**defaults)
Run Code Online (Sandbox Code Playgroud)


nbe*_*hat 10

Django 更好的管理 ArrayField 包正是提供了这个功能。与上述解决方案相比,它的优点是它允许您动态添加新条目,而不是依赖于预定义的选择。

请参阅此处的文档:django-better-admin-arrayfield

它有一个直接替代品ArrayField和一个简单的混合添加到管理模型。

# models.py
from django_better_admin_arrayfield.models.fields import ArrayField

class MyModel(models.Model):
    my_array_field = ArrayField(models.IntegerField(), null=True, blank=True)


# admin.py
from django_better_admin_arrayfield.admin.mixins import DynamicArrayMixin

@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin, DynamicArrayMixin):
    ...
Run Code Online (Sandbox Code Playgroud)

这会显示如下内容:

在此输入图像描述