2009-12-17 3 views
5

Ist es möglich, das Abfrage-Set eines ForeignKey-Felds eines Formulars festzulegen, so dass es separate Abfrage-Sets benötigt und sie in <optgroup> ausgibt?Verwenden Sie <optgroup> mit form.fields.queryset?

Hier ist, was ich habe:

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

In meinem Template-Modell, ich habe die Standard-Vorlagen und Benutzer erstellte Vorlagen. Ich möchte, dass sie in der <select> Box z. B. sichtbar getrennt werden.

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

Kann dies getan werden?

Antwort

10

ich war in der Lage, es herauszufinden, das Beispiel auf 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 war auf der Suche! Genau was der Dr. bestellt hat! Ich war auf der Suche nach einer Möglichkeit, form.fields ['field'] zu manipulieren, queryset in etwas Brauchbares und .choices entgingen mir völlig. Groß! – radtek

4

Ich habe in der Vergangenheit getan, indem Sie keinen Fremdschlüssel auf dem Formular, sondern eine charfield with choices.

Ein CharField mit Auswahlmöglichkeiten unterstützt optgroups. Sie müssen die Auswahl in diesem Format haben:

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

Wahlmöglichkeiten können auch aufrufbar sein. Also habe ich meine eigene Funktion erstellt, die die Modelle durchquert und ein Tupel wie das obige aufbaut.

+0

Dank gegeben mit .. Das war, was ich für .. –