Django: Admin: изменение виджета поля в Admin - PullRequest
22 голосов
/ 02 декабря 2010

У меня есть модель с логическим значением, подобным этому:

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

Появляется как флажок в админке.

  1. Как я могу использовать это в качестве переключателя в админке?
  2. Кроме того, как мне сделать так, чтобы оно всегда было с определенным выбранным значением в admin?
  3. Кроме того, я хочу, чтобы значение по умолчанию было противоположным, когда пользователь без прав администратора добавляет TagCat. Это поле должно быть скрыто от него.

Может кто-нибудь сказать мне, как это сделать? Документация Django, похоже, не содержит таких подробностей.

Ответы [ 3 ]

33 голосов
/ 29 октября 2012

Есть еще один способ сделать это, IMO намного проще, если вы хотите, чтобы все поля одного типа имели одинаковый виджет. Это делается путем указания formfield_overrides для ModelAdmin. Например:

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

33 голосов
/ 02 декабря 2010

ОБНОВЛЕНИЕ 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)
9 голосов
/ 01 июля 2013

Вот более динамичное расширение ответа 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

Таким образом, вы получаете полный контроль над полями.

...