2009-04-09 9 views
11

Ich habe ein CheckboxSelectMultiple Feld, warum kann ich nicht über die einzelnen Optionen iterieren?Iterate über Optionen in CheckboxSelectMultiple

funktioniert das nicht:

{%for choice in form.travels.choices%} 
    {{choice}} 
    {%endfor%} 

Selbst {{choice.0}} Angabe nicht hilft, wie ich dies tun könnte?

Dank

Antwort

29

In der Vorlage, das travels Feld als tatsächlich eine Instanz von BoundField (das ein Django Objekt ist, das das Feld und seinen Wert für das Rendering bindet zusammen). Dies bedeutet, dass die Eigenschaften etwas anders sind.

Um die Auswahl als Tupel iterieren:

{% for choice_id, choice_label in form.travels.field.choices %} 
    {{ choice_id }} = {{ choice_label }} <br/> 
{% endfor %} 

Produces: 1 = One 
      2 = Two 

Hoffnung, die hilft:

{% for choice in form.travels.field.choices %} 
    {{ choice }} - 
{% endfor %} 

Produces: (1, 'One') - (2, 'Two') - 

Um die Elemente in der Wahl Tupel getrennt iterieren. Allerdings bin ich mir nicht sicher, in welchem ​​Kontext Sie dies tun müssen. Auf der Oberfläche scheint es nicht sehr djangoartig zu sein. Sie können feststellen, dass die Verwendung eines benutzerdefinierten Formularfelds oder eines benutzerdefinierten Vorlagen-Tags eine portablere, wiederverwendbare Implementierung bietet, die die beabsichtigte Trennung von Ansichtscode und Vorlagencode von django besser beibehält. Natürlich, YMMV und es könnte gut sein, dass der direkte Iterationsansatz für Sie in diesem Fall geeignet ist.

+3

Ich weiß, das ist alt, aber gibt es eine Möglichkeit zu bestimmen, ob das Feld ausgewählt ist? –

+0

Seien Sie zunächst vorsichtig, wenn Sie ein benutzerdefiniertes Widget verwenden. Feldoptionen und Widgetoptionen sind möglicherweise nicht identisch. Sie müssen also "form.travels.field.widget.choices" verwenden. –

+0

Zweitens, für die benutzerdefinierte Auswahl, wenn Sie ein Radio-Widget verwenden, müssen Sie jeden Wert gegen den Feldwert überprüfen und die Eingabe auf "Überprüft" setzen, wenn sie übereinstimmen. Beispiel: "{% if form.travels.value = wahl_id%} checked =" checked "{% endif%}". –

0

Wenn Sie ein Form.ModelForm mit einem Auswahlfeld haben, können Sie es in der Vorlage durch einen einfachen Vorlagenfilter replizieren.

forms.py

STATE_CHOICES = (
    (10, 'NO'), 
    (4, 'YES'), 
    (18, 'Send to another Chemist for Review'), 
    (34, 'Send to another Market Expert for Review'), 
    (20, 'HOLD'), 
) 
new_state = forms.ChoiceField(
    choices=STATE_CHOICES, 
    required=True, 
) 

Vorlage:

{{ business_manager_form.new_state|filter_project_states:project }} 

und hier ist der Filter selbst ein.

@register.filter() 
def filter_project_states(argv, project): 
if project.department.id != 4: 
argv.field.choices = [choice for choice in argv.field.choices if choice[0] != 34] 
return argv 

Ich hoffe, das hilft.