tutorial español desde con cero django django-admin boolean field django-widget

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.

  1. ¿Cómo podría usar esto como un botón de radio en admin?
  2. Además, ¿cómo hago que sea siempre con un cierto valor seleccionado en admin?
  3. 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