Django: Admin: изменение виджета поля в Admin

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

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

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

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

может кто подскажет как это сделать? Документация Django, похоже, не идет в таких деталях.

3 ответов


обновление 1: код, который делает меня с 1) (Не забудьте передать выбор в 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)

есть другой способ сделать это, то есть 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

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