2009-12-17 13 views
5

Czy można ustawić zestaw zapytań pola cudzysłowu formularza, aby wykonywał on osobne zapytania i wyświetlał je w postaci <optgroup>?Użyj <optgroup> za pomocą formularza.fields.queryset?

Oto co mam:

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

W moim modelu szablonu, mam domyślnych szablonów i szablony tworzone przez użytkowników. Chcę, aby były wyraźnie widoczne w polu <select> np.

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

Czy można to zrobić?

Odpowiedz

10

udało mi się ustalić to na przykładzie podane 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! Dokładnie to, co doktor zamówił! Szukałem sposobu na manipulowanie form.fields ['field']. Queryset w coś niestandardowego i .choices całkowicie pośliznął mi się w głowie. Wspaniały! – radtek

4

Zrobiłem w przeszłości, nie używając obcego klucza w formularzu, ale raczej charfield with choices.

CharField z opcjami wsparcia optgroups. Musisz mieć opcje w tym formacie:

("Grupa 1", (("1", "Yada"), ("2", "Yada"))), ("Grupa 2") (('3', 'Bepety') ('4', 'Bopity')))

wybory mogą być wywoływalnym. Stworzyłem więc moją własną funkcję, która przemierza modele i buduje krotkę jak wyżej.

+0

Dzięki .. To było to, czego szukałem .. –

Powiązane problemy