我有一个模型有一个布尔值,像这样:
class TagCat(models.Model):
by_admin = models.BooleanField(default=True)
这个在管理页面显示为复选框。
- 我如何在管理页面中将其用作单选按钮?
- 另外,我如何使其始终带有特定的选定值在管理页面中?
- 我还想默认值相反,在非管理员用户添加
TagCat
时将此字段隐藏。
有人能告诉我如何做到这一点吗? Django 文档似乎没有详细说明。
我有一个模型有一个布尔值,像这样:
class TagCat(models.Model):
by_admin = models.BooleanField(default=True)
这个在管理页面显示为复选框。
TagCat
时将此字段隐藏。有人能告诉我如何做到这一点吗? Django 文档似乎没有详细说明。
更新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)
fields ='__all__'
行似乎是必要的。 - Amir Ali Akbari如果你想让同一类型的每个字段都具有相同的小部件,那么有另一种更简单的方法。可以通过在 ModelAdmin 中指定 formfield_overrides 来实现。例如:
from django.forms.widgets import Textarea
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': Textarea},
}
form_class
;例如,在十进制数中忽略逗号:formfield_overrides = {models.DecimalField: {'form_class': MyDecimalField}}
。 - Dispenser这是对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
通过这种方式,您可以完全控制字段。
class MyAdmin(admin.ModelAdmin):
fields = ['name', 'by_admin']
form = MyAdminForm
def get_form(self, request, obj=None, change=False, **kwargs):
form = super().get_form(request, obj, change, **kwargs)
form.base_fields["by_admin"].label = 'My new label'
form.base_fields["by_admin"].widget = forms.RadioSelect()
return form