2009-12-17 4 views
5

Est-il possible de définir le jeu de requête du champ ForeignKey d'un formulaire afin qu'il prenne des ensembles de requêtes distincts et les affiche dans <optgroup>?Utilisez <optgroup> avec form.fields.queryset?

Voici ce que j'ai:

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

Dans mon modèle de modèle, j'ai défaut des modèles et des modèles créés par l'utilisateur. Je veux qu'ils soient visiblement séparés dans la boîte <select> par exemple.

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

Est-ce que cela peut être fait?

Répondre

10

j'ai pu comprendre à l'aide de l'exemple donné sur 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

de Nice! Exactement ce que le Dr a ordonné! Je cherchais un moyen de manipuler form.fields ['field']. Queryset en quelque chose de personnalisé et .choices complètement glissé mon esprit. Génial! – radtek

4

Je l'ai fait dans le passé en n'utilisant pas une clé étrangère sur le formulaire, mais plutôt un charfield with choices.

Un CharField avec des choix supporte les optgroups. Vous devez avoir le choix dans ce format:

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

Les choix peuvent également être appelables. J'ai donc créé ma propre fonction qui traverse les modèles et construit un tuple comme ci-dessus.

+0

Merci .. C'était ce que je cherchais .. –