34

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

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

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

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

有人可以告诉我该怎么做吗?Django 文档似乎没有详细说明。

4

3 回答 3

52

更新 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)
于 2010-12-02T17:32:39.083 回答
45

There is another way to do this that is, IMO much easier if you want every field of the same type to have the same widget. This is done by specifying a formfield_overrides to the ModelAdmin. For example:

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

More in the docs: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

UPDATED: Link to Django 2.0 version: https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

于 2012-10-28T20:08:44.447 回答
13

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

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

于 2013-07-01T12:48:10.867 回答