2012-08-13 5 views
10

Ho riscontrato problemi nell'utilizzo di un ChoiceField per creare un elenco a discesa di valori nel database. Ecco il frammento di codiceDjango ChoiceField popolato dai valori di database

from django import forms 
from testplatform.models import ServiceOffering 

class ContactForm(forms.Form): 

    subject = forms.ChoiceField(queryset=ServiceOffering.objects.all()) 
    #subject = forms.ModelMultipleChoiceField(queryset=ServiceOffering.objects.all()) 

La #subject .... linea funziona, ma quando uso la linea ChoiceField (set di query ....) ottengo il seguente errore.

__init__() got an unexpected keyword argument 'queryset' 

Qualche idea?

risposta

24

ChoiceField non ha un set di query. Siete alla ricerca di ModelChoiceField

+0

eccellente - che ha funzionato a meraviglia. Ottengo un valore ------ come valore predefinito nel menu a tendina. Posso cambiarlo? Grazie! – Oli

+1

Se viene visualizzato in questo modo se il campo è facoltativo, impostare il campo nel modulo su 'required = True' per rimuoverlo. –

3

Utilizzare la ModelChoiceFieldLink Here

ChoiceField non supporta set di query

+0

Seriamente? Era davvero necessario ripubblicare la mia risposta con un link e un leggero cambio di formato? –

+0

Siamo spiacenti, ho aperto la finestra di risposta e sono andato per quel collegamento. Una volta tornato lo hai già postato. Ancora una volta mi dispiace. Non so come cancellare la mia risposta in modo esplicito –

+0

grazie - capito .. Suppongo di poter usare il valore iniziale in modo da non vedere il ------ apparire? – Oli

5

se si desidera popolare elenco a discesa dal database, ti consiglio di passare tutti i valori nel singolo oggetto da views.py al tuo modello. Si può fare in questo modo: 1] recuperare tutti i valori dal database:

objectlist = ModelName.objects.all() 

se si desidera lista ordinata nella lista a discesa, fare questo:

objectlist = ModelName.objects.all().order_by('fieldname') 

se si vuole distinctlist, farlo :

objectlist = ModelName.objects.distinct('fieldname') 

2] passare questo rende questo 'ObjectList' con il modello

return render(request, 'template.html', {'objectlist': objectlist}) 

3] Nel modello utilizzare un tag select e in user for loop per iterare sopra l'objectlist.

<select> 


{% for element in objectlist %} 


<option value={{ element.id }}>{{ element.name }} 



    </select> 

valore nel tag opzione dipende da ciò che è necessario elaborare nel vostro API