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

s6fujrry  于 2023-01-31  发布在  Go
关注(0)|答案(3)|浏览(125)

我有一个布尔值如下的模型:

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

这在admin中显示为复选框。
1.我怎样才能在管理中使用这个单选按钮呢?
1.另外,我如何使它总是与某个选定的值在管理?
1.另外,当非管理员用户添加TagCat时,我希望默认值是相反的。
有人能告诉我怎么做吗?Django文档似乎没有这么详细。

rqqzpn5f

rqqzpn5f1#

更新1:完成1)的代码(别忘了将选择传递给模型中的布尔字段)

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.我在www.example.com中使用以下信息解决MyModel.py:

BYADMIN_CHOICES = (
    (1, "Yes"),
    (0, "No"),
)

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

lokaqttq2#

还有另一种方法可以做到这一点,那就是,如果你想让相同类型的每个字段都有相同的小部件,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/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

6qqygrtg

6qqygrtg3#

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

这样你就能完全控制场了。

相关问题