2009-12-17 1 views
5

E 'possibile impostare set di query di campo ForeignKey di un modulo in modo che ci vorranno set di query di e li uscita separata nel <optgroup> 's?Usa <optgroup> con form.fields.queryset?

Ecco quello che ho:

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') 

Nel mio modello Template, ho modelli predefiniti e modelli creati dall'utente. Voglio che siano visibilmente separati nella casella <select> es.

<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> 

Questo può essere fatto?

risposta

10

sono stato in grado di capirlo con l'esempio dato in 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

Nizza! Esattamente ciò che il Dr. ha ordinato! Stavo cercando un modo per manipolare form.fields ['field']. Queryset in qualcosa di personalizzato e .coices mi è completamente sfuggito di mente. Grande! – radtek

4

che ho fatto in passato, non utilizzando una chiave esterna sulla forma, ma piuttosto un charfield with choices.

Un CharField con optgroups supporto scelte. È necessario avere le scelte in questo formato:

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

scelte possono anche essere un richiamabile. Così ho creato la mia funzione che attraversa i modelli e crea una tupla come quella sopra.

+0

Grazie .. Questo era quello che cercavo .. –