2009-04-09 3 views
11

Ho un campo CheckboxSelectMultiple, perché non posso scorrere le singole scelte?Iterate su scelte in CheckboxSelectMultiple

Questo non funziona:

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

Anche specificando {{choice.0}} non aiuta, come potrei fare questo?

Grazie

risposta

29

Nel template, il campo travels come effettivamente un'istanza di BoundField (che è un oggetto Django che lega insieme il campo e il suo valore per il rendering). Ciò significa che le proprietà sono in qualche modo diverse.

per scorrere le scelte come tuple:

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

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

per scorrere gli elementi in tuple scelta separatamente:

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

Produces: 1 = One 
      2 = Two 

Speranza che aiuta. Detto questo, però, non sono sicuro del contesto in cui hai bisogno di farlo; in superficie, non sembra molto simile al Django. Potresti scoprire che l'utilizzo di un campo modulo personalizzato o di un tag modello personalizzato ti offre un'implementazione più portabile e riutilizzabile che mantiene al meglio la separazione intenzionale di django tra codice vista e codice modello. Naturalmente, YMMV e potrebbe benissimo essere che l'approccio di iterazione diretta sia appropriato per te in questo caso.

+3

So che questo è vecchio, ma c'è un modo per determinare se il campo è selezionato? –

+0

Prima di tutto, fai attenzione quando usi un widget personalizzato, le opzioni di campo e le opzioni del widget potrebbero non essere le stesse. Quindi dovrai usare "form.travels.field.widget.choices". –

+0

In secondo luogo, per la selezione personalizzata se si utilizza un widget radio, è necessario verificare ogni valore rispetto al valore del campo e impostare l'input su controllato quando corrispondono. Ad esempio: "{% if form.travels.value = choice_id%} checked =" checked "{% endif%}". –

0

se si dispone di Form.ModelForm con un campo di scelta, è possibile inserirlo nel modello mediante un semplice filtro modello.

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

Template:

{{ business_manager_form.new_state|filter_project_states:project }} 

e qui è il filtro è di per sé.

@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 

Spero che questo aiuti.