2012-09-27 20 views
7

Ho un modello che ha un CharField e nell'amministratore voglio aggiungere scelte al widget. Il motivo è che sto usando un modello proxy e ci sono un sacco di modelli che condividono questo CharField, ma ognuno di essi ha scelte diverse.Campo scelta amministratore di 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) 

Per questo modello voglio usare MY_CHOICES in MyModelAdmin.

Ho eseguito l'override di un widget? Devo sovrascrivere l'intero modulo?

risposta

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) 

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

+1

Grazie mille, stavo scavando attraverso la documentazione e perso questo: S non c'è modo di evitare di creare un ModelForm c'è? –

+0

Non penso che ci sia. Perché? – demux

+0

solo controllando, ho pensato che potrebbe esserci un'opzione per passare semplicemente al charfield o come meta-opzione o qualcos'altro. –

3

È necessario sovrascrivere la forma del ModelAdmin sta per usare:

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() 

Se è necessario le scelte per essere dinamica, forse si potrebbe fare qualcosa di simile 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 

e nel vostro ModelAdmin 's __init__ definire ciò che sarà MY_CHOICES e assegnare l'istanza del modulo invece:

Buona fortuna! :)

+0

Ho pensato alle forme.CharField era come model.CharField e aveva l'opzione di scelta. Ma ho deciso di ricontrollare e ho scoperto che i moduli hanno ChoiceField (vedi la mia risposta). – demux

0

in Gerard's answer, se si mantiene:

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

poi, quando si cercherà di aggiungere nuovo modello da admin, avrai sempre 'Questo campo è obbligatorio.' per tutti i campi obbligatori.

è necessario rimuovere stuff_choices=() da inizializzazione:

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

È necessario pensare a come si sta andando per memorizzare i dati ad un livello di database. Suggerisco di fare questo:

  1. eseguire questo comando pip: pip install django-multiselectfield
  2. Nel file 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. Nel vostro settings.py:

    INSTALLED_APPS = (
         'django.contrib.auth', 
         'django.contrib.contenttypes', 
         'django.contrib.sessions', 
         'django.contrib.sites', 
         'django.contrib.admin', 
    
         #.....................# 
    
         'multiselectfield', 
    ) 
    
  4. Guarda la MAGIA capita!

Fonte:

Problemi correlati