2010-12-02 27 views
17

tengo un modelo con un valor booleano así:Django: Admin: cambiar el widget del campo en administración

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

Esto aparece como una casilla de verificación en la administración.

  1. ¿Cómo podría usar esto como un botón de opción 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 para él.

¿Alguien me puede decir cómo hacerlo? La documentación de Django no parece entrar en esos detalles.

+0

Su primera pregunta es respondida en http://stackoverflow.com/questions/854683/django-booleanfield-as-radio-buttons –

+0

He leído esa pregunta. Las respuestas parecen decir cómo reemplazarlo en general, mientras que quiero que ese caso específico solo sea de radio. La última respuesta parece ser lo que quiero, y lo intenté y no funcionó, porque en el administrador, solo aparece la etiqueta. Pegaré mi código como 'ACTUALIZACIÓN 1' – mgPePe

Respuesta

29

ACTUALIZACIÓN 1: Código que me se hace con 1) (no se olvide tot pasar opciones al BooleanField 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 radio aparecen feo y desplazados, pero al menos, trabajar

2) he resuelto 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) 
+0

¡Esto me ayudó mucho! ¡Gracias! :RE – lucasmonteiro001

22

Hay otra manera de hacer esto es que, en mi opinión mucho más fácil si quieres todos los campos del mismo tipo para VHA e 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 la documentación: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_overrides

9

Aquí es 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 

esta manera se obtiene un control total sobre los campos.

Cuestiones relacionadas