español - tutorial django
Django: Admin: cambiando el widget del campo en Admin (3)
Tengo un modelo con un valor booleano como ese:
class TagCat(models.Model):
by_admin = models.BooleanField(default=True)
Esto aparece como una casilla de verificación en el administrador.
- ¿Cómo podría usar esto como un botón de radio en admin?
- Además, ¿cómo hago que sea siempre con un cierto valor seleccionado en admin?
- Además, quiero que el valor predeterminado sea el opuesto, cuando un usuario no administrador agrega un
TagCat
. Este campo debe estar oculto de él.
alguien puede decirme cómo hacer esto? La documentación de Django no parece ir en tales detalles.
ACTUALIZACIÓN 1: Código que me permite terminar con 1) (no olvide pasar las OPCIONES al Campo Booleano en el modelo)
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)
Los botones de opción aparecen feos y desplazados, pero al menos funcionan.
2) Resolví con la siguiente información en MyModel.py:
BYADMIN_CHOICES = (
(1, "Yes"),
(0, "No"),
)
class TagCat(models.Model):
by_admin = models.BooleanField(choices=BYADMIN_CHOICES,default=1)
Aquí hay una extensión más dinámica de la respuesta de 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
De esta manera obtienes control total sobre los campos.
Hay otra forma de hacerlo, es decir, IMO es mucho más fácil si desea que todos los campos del mismo tipo tengan el mismo widget. Esto se hace especificando un formfield_overrides al ModelAdmin. Por ejemplo:
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {''widget'': RichTextEditorWidget},
}
Más en los documentos: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides
ACTUALIZADO: Enlace a la versión Django 2.0: https://docs.djangoproject.com/en/2.0/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides