2012-08-13 10 views
10

Tengo problemas al utilizar un campo ChoiceField para crear una lista desplegable de valores en la base de datos. Aquí está el fragmento de códigoDjango ChoiceField rellenado de los valores de la base de datos

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 línea de #subject .... funciona, pero cuando se utiliza la línea ChoiceField (queryset ....) me sale el siguiente error.

__init__() got an unexpected keyword argument 'queryset' 

¿Alguna idea?

Respuesta

24

ChoiceField no tiene un conjunto de preguntas. Usted está buscando ModelChoiceField

+0

Excelente - que funcionaba un lujo. Obtengo ------ como valor predeterminado en el cuadro desplegable. ¿Puedo cambiar eso? ¡Gracias! – Oli

+1

Si se muestra de esa manera si el campo es opcional, configure el campo en el formulario a 'required = True' para eliminarlo. –

3

Usar la ModelChoiceFieldLink Here

ChoiceField no soporta queryset

+0

en serio? ¿Era realmente necesario volver a publicar mi respuesta con un enlace y un ligero cambio de formato? –

+0

Lo siento, he abierto la ventana de respuestas y me he ido por ese enlace. Una vez que regrese, ya lo ha publicado. Una vez más lo siento No sé cómo eliminar mi respuesta explícitamente –

+0

gracias - lo tengo ... Supongo que puedo usar el valor inicial para que no aparezca el ------ ¿aparece? – Oli

5

si desea rellenar la lista desplegable de la base de datos, voy a recomendar que pasar todas los valores en un solo objeto desde views.py a su plantilla. Puede hacerlo de esta manera: 1] obtener todos los valores de la base de datos:

objectlist = ModelName.objects.all() 

si quieres lista clasificada en la lista desplegable, haga esto:

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

si quieres distinctlist, hacer esto :

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

2] Pasar este render esta 'objectlist' con la plantilla

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

3] En la plantilla use una etiqueta de selección, y en usuario para el bucle para iterar sobre la lista de objetos.

<select> 


{% for element in objectlist %} 


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



    </select> 

valor en la etiqueta de opción depende de lo que necesita para procesar en su API

Cuestiones relacionadas