2012-09-27 15 views
7

Tengo un modelo que tiene un CharField y en el administrador deseo agregar opciones al widget. La razón de esto es que estoy usando un modelo de proxy y hay un montón de modelos que comparten este CharField pero cada uno tiene diferentes opciones.Campo de elección de administrador de Django

class MyModel(MyBaseModel): 
    stuff = models.CharField('Stuff', max_length=255, default=None) 

    class Meta: 
     proxy = True 

class MyModelAdmin(admin.ModelAdmin): 
    fields = ('stuff',) 
    list_display = ('stuff',) 
admin.site.register(MyModel, MyModelAdmin) 

Para este modelo Quiero usar MY_CHOICES en MyModelAdmin.

¿Reemplace un widget? ¿Debo anular todo el formulario?

Respuesta

14
from django.contrib import admin 
from django import forms 

class MyModel(MyBaseModel): 
    stuff = models.CharField('Stuff', max_length=255, default=None) 

    class Meta: 
     proxy = True 

class MyModelForm(forms.ModelForm): 
    MY_CHOICES = (
     ('A', 'Choice A'), 
     ('B', 'Choice B'), 
    ) 

    stuff = forms.ChoiceField(choices=MY_CHOICES) 

class MyModelAdmin(admin.ModelAdmin): 
    fields = ('stuff',) 
    list_display = ('stuff',) 
    form = MyModelForm 

admin.site.register(MyModel, MyModelAdmin) 

Ver: https://docs.djangoproject.com/en/dev/ref/forms/fields/#choicefield

+1

Muchas gracias, yo estaba cavando a través de los documentos y se perdió esta: s no hay manera de evitar crear es un ModelForm allí? –

+0

No creo que exista. ¿Por qué? – demux

+0

simplemente comprobando, pensé que podría haber una opción para simplemente pasarlo al charfield o como una meta opción u otra cosa. –

3

Necesita anular la forma del ModelAdmin se va a utilizar:

class MyForm(forms.ModelForm): 
    stuff = forms.CharField('Stuff', max_length=255, choices=MY_CHOICES, default=None) 

    class Meta: 
     model = MyModel 
     fields = ('stuff', 'other_field', 'another_field') 


class MyModelAdmin(admin.ModelAdmin): 
    fields = ('stuff',) 
    list_display = ('stuff',) 
    form = MyForm() 

Si necesita sus opciones a ser dinámico, tal vez se podría hacer algo similar a :

class MyForm(forms.ModelForm): 
    stuff = forms.CharField('Stuff', max_length=255, choices=MY_CHOICES, default=None) 

    def __init__(self, stuff_choices=(), *args, **kwargs): 
     # receive a tupple/list for custom choices 
     super(MyForm, self).__init__(*args, **kwargs) 
     self.fields['stuff'].choices = stuff_choices 

y en su ModelAdmin 's __init__ define qué va a ser MY_CHOICES y asigne la instancia de formulario allí:

¡Buena suerte! :)

+0

Pensé que los formularios.CharField era como los modelos.CharField y tenía la opción de opciones. Pero decidí volver a verificar y descubrí que los formularios tienen ChoiceField (ver mi respuesta). – demux

0

en Gerard's answer, si se mantiene:

def __init__(self, stuff_choices=(), *args, **kwargs): 

a continuación, cuando se trate de añadir nuevo modelo de administración, siempre obtendrá 'Este campo es obligatorio.' para todos los campos requeridos

debe quitar stuff_choices=() de inicialización:

def __init__(self,*args, **kwargs): 
0

Usted necesita pensar en cómo se va a almacenar los datos en un nivel de base de datos. Sugiero hacer esto:

  1. Ejecutar este comando pip: pip install django-multiselectfield
  2. En el archivo models.py:

    from multiselectfield import MultiSelectField 
    
    MY_CHOICES = (('item_key1', 'Item title 1.1'), 
          ('item_key2', 'Item title 1.2'), 
          ('item_key3', 'Item title 1.3'), 
          ('item_key4', 'Item title 1.4'), 
          ('item_key5', 'Item title 1.5')) 
    
    class MyModel(models.Model): 
         my_field = MultiSelectField(choices=MY_CHOICES) 
    
  3. En su settings.py:

    INSTALLED_APPS = (
         'django.contrib.auth', 
         'django.contrib.contenttypes', 
         'django.contrib.sessions', 
         'django.contrib.sites', 
         'django.contrib.admin', 
    
         #.....................# 
    
         'multiselectfield', 
    ) 
    
  4. ¡Mira cómo sucede la MAGIA!

Fuente:

Cuestiones relacionadas