2009-12-17 4 views
5

¿Es posible establecer un conjunto de preguntas del campo ForeignKey del formulario para que tome los conjuntos de consultas separados y los muestre en <optgroup>?Use <optgroup> con form.fields.queryset?

Aquí es lo que tengo:

views.py

form = TemplateFormBasic(initial={'template': digest.template.id}) 
form.fields['template'].queryset = Template.objects.filter(Q(default=1) | Q(user=request.user)).order_by('name') 

En mi modelo de plantilla, tengo plantillas predeterminadas y las plantillas creadas por el usuario. Quiero que estén visiblemente separados en el cuadro <select>, por ejemplo.

<select> 
    <optgroup label="Default Templates"> 
    <option>Default 1</option> 
    <option>Default 2</option> 
    </optgroup> 
    <optgroup label="User Templates"> 
    <option>User Template 1</option> 
    <option>User Template 2</option> 
    </optgroup> 
</select> 

¿Se puede hacer esto?

Respuesta

10

pude averiguarlo utilizando el ejemplo dado en this blog

views.py

form.fields['template'].choices = templates_as_choices(request) 

def templates_as_choices(request): 
    templates = [] 
    default = [] 
    user = [] 
    for template in Template.objects.filter(default=1).order_by('name'): 
     default.append([template.id, template.name]) 

    for template in Template.objects.filter(user=request.user).order_by('name'): 
     user.append([template.id, template.name]) 

    templates.append(['Default Templates', default]) 
    templates.append(['User Templates', user]) 

    return templates 
+0

Nice! ¡Exactamente lo que ordenó el Dr.! Estaba buscando una forma de manipular form.fields ['field']. Queryset en algo personalizado y las opciones se me escaparon por completo. ¡Estupendo! – radtek

4

Lo he hecho en el pasado al no usar una clave foránea en el formulario, sino más bien un charfield with choices.

A CharField con opciones de compatibilidad con grupos de opciones. Necesita tener las opciones en este formato:

('Grupo 1', (('1', 'Yada'), ('2', 'Yada'))), ('Grupo 2' , (('3', 'Bepety'), ('4', 'Bopity')))

Las opciones también se pueden llamar. Así que creé mi propia función que atraviesa los modelos y construye una tupla como la anterior.

+0

Gracias .. Esto era lo que estaba buscando .. –

Cuestiones relacionadas