2009-08-14 12 views
6

Ho un modello di Django, esempio di codice di seguito (non il mio codice vero e proprio):Controllo Django ModelForm uscita

class Department(models.Model): 
    name = models.CharField(max_length=100) 
    abbreviation = models.CharField(max_length=4) 

Diciamo che faccio la seguente nella shell Django:

>>> Department(name='Computer Science',abbreviation='C S ').save() 
>>> Department(name='Mathematics',abbreviation='MATH').save() 
>>> Department(name='Anthropology',abbreviation='ANTH').save() 

Ora ho quei quattro reparti memorizzati nel mio database. Dire che abbiamo un'altra classe, Course, che appartiene a un Department:

class Course(models.Model): 
    department = models.ForeignKey('Department') 
    number = models.IntegerField() 

class CourseForm(ModelForm): 
    class Meta: 
     model = Course 

Se rendo l'oggetto ModelForm direttamente in un modello semplicemente referncing una variabile, dire form, che ha ottenuto tramandata, i Dipartimenti appaiono in un casella a discesa (una casella di selezione HTML). Fin qui tutto bene.

Il problema è: gli elementi nella casella di selezione sono ordinati per ID. Così appaiono come:

  1. Tecnologia dell'informazione
  2. Matematica
  3. Antropologia

Ma, voglio che in ordine alfabetico, cioè

  1. Antropologia
  2. Tecnologia dell'informazione
  3. Matematica

Come posso cambiare il modo in cui questi elementi sono ordinati in t codice ModelForm o nel codice Model anziché nel modello?

E in generale, come è possibile personalizzare il modo in cui un determinato campo o widget funziona quando generato da un ModelForm?

risposta

9

Come posso modificare il modo in cui questi elementi sono ordinati nel codice ModelForm o nel codice Modello, piuttosto che nel modello?

Una cosa che puoi fare è aggiungere un orderingmeta option. A tale scopo, l'aggiunta di una classe interna Meta a una classe, con l'attributo specificato ordering:

class Department(models.Model): 
    name = models.CharField(max_length=100) 
    abbreviation = models.CharField(max_length=4) 

    class Meta: 
     ordering = ["name"] 

Si noti che questo cambia ordinamento predefinito per Department modelli (non solo quando viene utilizzato in una forma).

E in generale, come è possibile personalizzare il modo in cui un particolare campo o widget funziona quando generato da un ModelForm?

Ti consigliamo di leggere i documenti Django su ModelForm e built-in form fields. In particolare, prestare attenzione all'attributo opzionale widget, che consente di modificare il widget di un campo modulo. I diversi tipi di widget sono descritti here.

+0

Grazie! Questo è ESATTAMENTE quello che stavo cercando. –

+0

Wow - ottima risposta! – sage

1

mipadi ha mostrato come modificare l'ordine per il modello del Dipartimento e ciò si riflette nel widget del modulo.

Tuttavia, se si voleva solo per cambiare l'ordinamento per quel widget, e lasciare ordinamento di default del modello come qualcosa di diverso, si potrebbe fare questo:

class CourseForm(ModelForm): 
    department = forms.ModelChoiceField(
          queryset=Department.objects.order_by('name')) 

    class Meta: 
     model = Course 
Problemi correlati