Django: Admin: изменение виджета поля в Admin
у меня есть модель с таким логическим значением:
class TagCat(models.Model):
by_admin = models.BooleanField(default=True)
это отображается как флажок в admin.
- как я могу использовать это как переключатель в админке?
- кроме того, как сделать это всегда с определенным выбранным значением в admin?
- кроме того, я хочу, чтобы значение по умолчанию было наоборот, когда пользователь-не администратор добавляет
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
таким образом, вы получаете полный контроль над полями.