Django:管理界面:更改管理界面中字段的小部件

38

我有一个模型有一个布尔值,像这样:

class TagCat(models.Model):
    by_admin = models.BooleanField(default=True) 

这个在管理页面显示为复选框。

  1. 我如何在管理页面中将其用作单选按钮?
  2. 另外,我如何使其始终带有特定的选定值在管理页面中?
  3. 我还想默认值相反,在非管理员用户添加 TagCat 时将此字段隐藏。

有人能告诉我如何做到这一点吗? Django 文档似乎没有详细说明。


你的第一个问题在https://dev59.com/C3RA5IYBdhLWcg3wtwWe 中已经得到回答。 - Dominic Rodger
我已经阅读了那个问题。答案似乎是关于如何一般性地替换它,而我只想将特定情况下的单选按钮替换掉。最后一个答案似乎是我想要的,我尝试了一下,但没有成功,因为在管理界面中只显示标签。我将我的代码粘贴为“UPDATE 1”。 - mgPePe
4个回答

57

更新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)

单选按钮看起来不美观且错位,但至少它们能用。

  1. 我在 MyModel.py 中使用以下信息解决了此问题:
BYADMIN_CHOICES = (
    (1, "Yes"),
    (0, "No"),
)

class TagCat(models.Model):
    by_admin = models.BooleanField(choices=BYADMIN_CHOICES,default=1)

1
在最近的Django版本中,向Meta类中添加fields ='__all__'行似乎是必要的。 - Amir Ali Akbari

52

如果您想覆盖字段类型,可以使用 form_class;例如,在十进制数中忽略逗号:formfield_overrides = {models.DecimalField: {'form_class': MyDecimalField}} - Dispenser
请问如何在Django管理后台中调整字段大小?可能需要修改代码。 - Michael Halim

15

这是对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

通过这种方式,您可以完全控制字段。


0
您还可以通过Admin类中的get_form()方法覆盖此设置。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接