Django:管理员:在管理员中更改字段的小部件

Posted

技术标签:

【中文标题】Django:管理员:在管理员中更改字段的小部件【英文标题】:Django: Admin: changing the widget of the field in Admin 【发布时间】:2011-05-19 05:57:38 【问题描述】:

我有一个具有类似布尔值的模型:

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

这在管理员中显示为一个复选框。

    如何在管理中将其用作单选按钮? 另外,如何让它在管理员中始终具有某个选定的值? 另外,当非管理员用户添加TagCat 时,我希望默认值相反。这个字段应该对他隐藏。

谁能告诉我怎么做? Django 文档似乎没有详细说明。

【问题讨论】:

您的第一个问题已在***.com/questions/854683/…得到解答 我确实读过这个问题。答案似乎说明了如何在一般情况下替换它,而我希望该特定情况仅是无线电。最后一个答案似乎是我想要的,我尝试了它并没有奏效,因为在管理员中,只有标签出现。我将我的代码粘贴为“UPDATE 1” 【参考方案1】:

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

单选按钮看起来丑陋且移位,但至少它们可以工作

    我解决了 MyModel.py 中的以下信息:
BYADMIN_CHOICES = (
    (1, "Yes"),
    (0, "No"),
)

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

【讨论】:

在最近的 Django 版本中似乎有必要在 Meta 类中添加 fields = '__all__' 行。【参考方案2】:

还有另一种方法可以做到这一点,如果您希望相同类型的每个字段都具有相同的小部件,IMO 会更容易。这是通过向 ModelAdmin 指定一个 formfield_overrides 来完成的。例如:

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = 
        models.TextField: 'widget': RichTextEditorWidget,
    

文档中的更多内容:https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

更新:链接到 Django 2.0 版本: https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

【讨论】:

如果要覆盖字段类型,请使用form_class;例如忽略小数中的逗号:formfield_overrides = models.DecimalField: 'form_class': MyDecimalField【参考方案3】:

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

这样您就可以完全控制这些字段。

【讨论】:

以上是关于Django:管理员:在管理员中更改字段的小部件的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin ForeignKey字段小部件选项和不一致的默认值

Django Modeltranslation:TranslationAdmin 类未复制正确的小部件

如何在 django 管理站点中使用 django-select2 小部件?

如何使用django管理员多对多个字段选择器小部件

在 Django admin 中更改日期字段的默认小部件

修改django管理字段以使用特定的queryset和表单小部件