我有一个像这样的布尔值模型:
class TagCat(models.Model):
by_admin = models.BooleanField(default=True)
这在管理员中显示为复选框。
TagCat
时,我希望默认值相反。这个领域应该对他隐藏。有人能告诉我怎么做吗? Django 文档似乎没有这么详细。
更新 1:让我完成 1) 的代码(不要忘记将 CHOICES 传递给模型中的 BooleanField)
from main.models import TagCat
from django.contrib import admin
from django import forms
class MyTagCatAdminForm(forms.ModelForm):
class Meta:
model = TagCat
widgets = {
'by_admin': forms.RadioSelect
}
fields = '__all__' # required for Django 3.x
class TagCatAdmin(admin.ModelAdmin):
form = MyTagCatAdminForm
admin.site.register(TagCat, TagCatAdmin)
单选按钮看起来丑陋且错位,但至少,它们有效
BYADMIN_CHOICES = (
(1, "Yes"),
(0, "No"),
)
class TagCat(models.Model):
by_admin = models.BooleanField(choices=BYADMIN_CHOICES,default=1)
还有另一种方法可以做到这一点,如果您希望相同类型的每个字段都具有相同的小部件,IMO 会容易得多。这是通过为 ModelAdmin 指定一个 formfield_overrides 来完成的。例如:
from django.forms.widgets import Textarea
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': Textarea},
}
这里是 mgPePe 回复的更动态扩展:
class MyAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(MyAdminForm, self).__init__(*args, **kwargs)
self.fields['by_admin'].label = 'My new label'
self.fields['by_admin'].widget = forms.RadioSelect()
class Meta:
model = TagCat
class MyAdmin(admin.ModelAdmin):
fields = ['name', 'by_admin']
form = MyAdminForm
这样你就可以完全控制这些领域。