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 的复选框:)
我有以下模型,其中包含用于不同状态的正小整数字段:
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 的复选框:)