Django 管理员将表单小部件从整数下拉列表更改为复选框

Django admin change form widget from integer dropdown to checkbox

我有以下模型,其中包含用于不同状态的正小整数字段:

class Shops(models.Model):

   STATUS_CHOICES = [
          (0, 'Inactive'),
          (1, 'Active'),
          (2, 'Closed'),
          (3, 'Transferred'),
      ]
  status = models.PositiveSmallIntegerField("Status", choices=STATUS_CHOICES, null=True, blank=True)

有了这个,管理站点状态小部件将生成为 select 框

但我希望它是一个复选框,复选框的值在 STATUS_CHOICE 之后为 0 和 1,并且我已经处理列表页面以仅按状态 = 0 或 1 进行过滤

管理页面的状态是这样的:

我试过像这样覆盖管理员更改表单:

#Form 

class ShopsForm(forms.ModelForm):

    status = forms.CheckboxInput()

    def __init__(self, *args, **kwargs):
        super(ShopsForm, self).__init__(*args, **kwargs)
        self.initial['status'] = False
        if self.instance:
            if self.instance.status is not None:
                try:
                    self.initial['status'] = False
                    if self.instance.status == 1:
                        self.initial['status'] = True
                except:
                    pass

        self.fields['status'].label = "Active"

    def clean_status(self):
        if self.cleaned_data['status'] is not None:
            data = self.cleaned_data['status']
        else:
            data = None

        return data

    class Meta:
        model = Shops
        exclude = ['status']

#ModelAdmin

class ShopsAdmin(admin.ModelAdmin):
    list_per_page = 50

    form = ShopsForm

    list_display = (
        ...
        'status'
    )

    list_display_links = (
        ...
        'status'
    )

    fields = (
        ...
        'status',
    )

    readonly_fields = (
        'id',
    )


    def save_model(self, request, obj, form, change):
        obj.status = 0
        if form.cleaned_data['status'] == True:
            obj.status = 1
        obj.save()
        return super(ShopsAdmin, self).save_model(request, obj, form, change)

    pass

admin.site.register(Shops, ShopsAdmin)

但是我在转到更改表单时遇到以下错误:

File "/app/backend/admin.py", line 2388, in __init__
web_1         |     self.fields['status'].label = "Active"
web_1         | KeyError: 'status'

我已经在表单中设置了自定义状态字段,但我很困惑,希望有人能帮助我

编辑:

我将 status = forms.CheckboxInput() 更改为 status = forms.IntegerField(required=False, widget=forms.CheckboxInput),现在复选框显示基于字段

但是当我尝试取消勾选并保存时 return 验证错误并且不允许我更改

Enter a whole number.

我发现了问题,我应该使用 forms.BooleanField() 而不是 forms.CheckboxInput()

我将表格更改为以下内容:

class ShopsForm(forms.ModelForm):

    active = forms.BooleanField(required=False)
    def __init__(self, *args, **kwargs):
        super(StakingForm, self).__init__(*args, **kwargs)
        self.initial['active'] = False
        if self.instance:
            if self.instance.status is not None:
                try:
                    self.initial['active'] = False
                    if self.instance.status == 1:
                        self.initial['active'] = True
                except:
                    pass

        self.fields['active'].label = "Active"

    def clean_active(self):
        if self.cleaned_data['active'] is not None:
            data = self.cleaned_data['active']
        else:
            data = None

        return data

    class Meta:
        model = Shops
        exclude = []

在管理员中我从字段元组

中删除了status
fields = (
        ....
        'active',
        #remove 'status'
    )

#and add override save so checkbox value save into status integer column

ef save_model(self, request, obj, form, change):
   obj.status = 0
   if form.cleaned_data['active'] == True:
      obj.status = 1
   obj.save()
   return super(ShopsAdmin, self).save_model(request, obj, form, change)

现在我有一个使用 IntegerField() 选择值 1 和 2 的复选框:)