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__'

И поиграть вокруг него

Вернуться на верх