2010-03-31 34 views
10

Digamos que estoy usando el modelo de Django Sitio:¿Cómo construyo un formulario Django con objetos de modelo en un widget Seleccionar?

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

Mi valores del sitio son (clave, valor):

1. Stackoverflow 
2. Serverfault 
3. Superuser 

Quiero construir un formulario con un widget de select html con el valores anteriores:

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

estoy pensando en comenzar con el siguiente código pero es incompleta:

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

¿Alguna idea de cómo lograrlo con Django?

EDIT

diferentes páginas presentarán diferentes valores del sitio. Una página de desarrollo mostrará los sitios de desarrollo, mientras que una página de cocina mostrará los sitios de recetas. Básicamente quiero rellenar dinámicamente las opciones de widgets en función de la vista. Creo que puedo lograrlo en este momento al generar manualmente el html en la plantilla.

Respuesta

11

Creo que estás buscando ModelChoiceField.

ACTUALIZACIÓN: Tenga en cuenta especialmente el argumento queryset. En la vista que respalda la página, puede cambiar el QuerySet que proporciona de acuerdo con los criterios que le interesan.

+0

¿Puedo especificar el queryset en la vista? –

+0

Como en, proporcione el 'QuerySet' para usar cada vez que crea una instancia de su' Form' No estoy seguro. Si sus posibilidades son limitadas, parece bastante sencillo proporcionar una subclase 'Form' adaptada a la vista específica que está utilizando, por ejemplo,' DeveloperSitesForm', 'EndUserSitesForm', etc. –

+1

Pude hacerlo desde el código en esa pregunta: http://stackoverflow.com/questions/622982/django-passing-custom-form-parameters-to-formset –

10

no he probado esto, pero estoy pensando en algo en la línea de ...

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

Editar -

simplemente he intentado esto y que no genera las opciones correctamente . El argumento choices está esperando una lista de 2-tuplas como este ...

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

la .values_list devolverá ese formato exacto siempre que tenga el ID y el nombre/título/lo que sea tan así: .values_list('id', 'name'). Cuando se guarda el formulario, el valor de .site será el id/pk del sitio seleccionado.

+0

Esto evaluará el conjunto de consultas del sitio cuando se defina por primera vez el formulario. Si los datos cambian, el formulario no mostrará los datos nuevos. –

Cuestiones relacionadas