Джанго: администратор: изменение виджет поля в админке


У меня есть модель с таким логическим значением:

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

Это отображается как флажок в admin.

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

3 ответа:

Обновление 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
        }

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)

Есть еще один способ сделать это, 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

Вот более динамичное расширение ответа 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
Таким образом, вы получаете полный контроль над полями.