Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

UPDATE 1: код, который меня заводит с 1) (не забывайте, что tot pass 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)

Ответ 2

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

Ответ 3

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

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