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)
小智 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)
这会显示如下内容: