Django-admin: показать поле мультивыбора для JSONField
У меня есть модель с полем channel
(JSONField). В db у меня сильный массив строк с channel
. По умолчанию JSONField отображается как textarea в django-admin. Моя цель - каким-то образом сделать channel
полем с множественным выбором, которое позже преобразуется в такое ["APP", "WEB"]
.
models.py
@dataclass
class ChannelTypes:
WEB: str = 'WEB'
APP: str = 'APP'
class DiscountRule(models.Model):
...
channel = models.JSONField(null=False, blank=False, default=list(astuple(ChannelTypes())))
Мой подход:
В forms.py
добавьте пользовательские поля (boolean), которые отображаются только в форме администратора и не хранятся в db. Что-то вроде этого:
class RuleAdminForm(forms.ModelForm):
WEB = forms.BooleanField(required=False)
APP = forms.BooleanField(required=False)
Аналогично, admin.py
будет заполнять пользовательские поля следующим образом:
def get_form(self, request, obj=None, *args, **kwargs):
form = super(BaseDiscountRuleAdmin, self).get_form(request, *args, **kwargs)
for i in obj.channel:
form.base_fields[i].initial = True
return form
Но это вызывает проблему, что значение пользовательского поля сохраняется после обновления 1-2 раза из-за использования base_fields[field_name].initial
.
Идеи для цели: Мультивыбор варианта 1
Вы можете прикрепить к классу администратора пользовательскую форму
class DiscountRuleAdmin(admin.ModelAdmin):
form = DiscountRuleForm
и forms.py
class DiscountRuleForm(forms.ModelForm):
channel = forms.MultipleChoiceField(
widget=FilteredSelectMultiple('channels', False),
required=False,
)
class Meta:
model = DiscountRule
fields = '__all__'
И поиграть вокруг него