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

时间:2010-12-02 16:29:28

标签: django django-admin boolean field django-widget

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

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

这在admin中显示为复选框。

  1. 如何在管理员中将其用作单选按钮?
  2. 另外,如何在admin中始终使用某个选定值?
  3. 此外,当非管理员用户添加TagCat时,我希望默认值相反。这个字段应该对他隐藏。
  4. 有人能告诉我怎么做吗? Django文档似乎没有详细说明。

3 个答案:

答案 0 :(得分:33)

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

class TagCatAdmin(admin.ModelAdmin):
    form = MyTagCatAdminForm


admin.site.register(TagCat, TagCatAdmin)

单选按钮看起来很丑陋而且流离失所,但至少,它们起作用了

2)我在MyModel.py中解决了以下信息:

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

答案 1 :(得分:32)

还有另一种方法可以做到这一点,如果您希望相同类型的每个字段都具有相同的小部件,则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

答案 2 :(得分:9)

以下是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

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