2010-03-31 14 views
10

Diciamo che sto utilizzando il modello di Django sito:Come si costruisce un modulo Django con oggetti modello in un widget Seleziona?

class Site(models.Model): 
    name = models.CharField(max_length=50) 

miei valori del sito sono (chiave, valore):

1. Stackoverflow 
2. Serverfault 
3. Superuser 

Voglio costruire un modulo con un widget di selezione HTML con il valori di cui sopra:

<select> 
    <option value="1">Stackoverflow</option> 
    <option value="2">Serverfault</option> 
    <option value="3">Superuser</option> 
</select> 

sto pensando di iniziare con il seguente codice, ma è incompleta:

class SiteForm(forms.Form): 
    site = forms.IntegerField(widget=forms.Select()) 

Qualche idea su come ottenerlo con la forma di Django?

EDIT

pagine diverse presenteranno diversi valori del sito. Una pagina di sviluppo mostrerà i siti di sviluppo mentre una pagina di cottura mostrerà i siti di ricette. Fondamentalmente voglio popolare in modo dinamico le scelte del widget in base alla vista. Credo di poterlo realizzare al momento generando manualmente il codice HTML nel modello.

risposta

11

Penso che stiate cercando ModelChoiceField.

AGGIORNAMENTO: Soprattutto notare l'argomento queryset. Nella vista che sta eseguendo il backup della pagina, è possibile modificare l'QuerySet fornito in base ai criteri che ti interessano.

+0

Posso specificare il set di query nella vista? –

+0

Come in, fornire il 'QuerySet' da usare ogni volta che si istanzia il' Form'? Non ne sono sicuro. Se le tue possibilità sono limitate, sembra abbastanza semplice fornire una sottoclasse 'Form' su misura per la vista specifica che stai usando, ad esempio' DeveloperSitesForm', 'EndUserSitesForm', ecc. –

+1

Sono stato in grado di farlo dal codice in quella domanda: http://stackoverflow.com/questions/622982/dango-passing-custom-form-parameters-to-formset –

10

non ho ancora testato questo, ma sto pensando qualcosa sulla falsariga di ...

site = forms.IntegerField(
    widget=forms.Select(
     choices=Site.objects.all().values_list('id', 'name') 
     ) 
    ) 

Edit -

Ho appena provato questo fuori e lo fa generare correttamente le scelte . L'argomento choices si aspetta un elenco di 2-tuple come questo ...

(
    (1, 'stackoverflow'), 
    (2, 'superuser'), 
    (value, name), 
) 

Il .values_list restituirà quel formato esatto a patto di avere l'ID e il nome/titolo/qualcosa come così: .values_list('id', 'name'). Quando il modulo viene salvato, il valore di .site sarà l'id/pk del sito selezionato.

+0

Questo valuterà il queryset del sito quando il modulo viene definito per la prima volta. Se i dati cambiano, il modulo non mostrerà i nuovi dati. –

Problemi correlati