Django:Admin:更改 Admin 中字段的小部件

问题描述 投票:0回答:3

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

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

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

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

有人能告诉我怎么做吗? Django 文档似乎没有这么详细。

django django-admin boolean field django-widget
3个回答
55
投票

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

单选按钮看起来丑陋且错位,但至少,它们有效

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

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

50
投票

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

from django.forms.widgets import Textarea

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.TextField: {'widget': Textarea},
    }

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


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

这样你就可以完全控制这些领域。

© www.soinside.com 2019 - 2024. All rights reserved.