フォームに選択フィールドがあり、このフィールドのオプションを反復処理する必要があります。
{{ form.myselect }}
は私にこれを与えます:
<select name="myselect" id="id_myselect">
<option value="" selected="selected">---------</option>
<option value="2">Item 1</option>
<option value="3">Item 2</option>
...
</select>
次に、オプションにいくつかの属性を追加する必要があります。そのため、必要なのは次のとおりです。
<select name="myselect" id="id_myselect">
{% for x in form.myselect %}
<option value="{{ x.id }}">{{ x.name }}</option>
{% endfor %}
</select>
しかしエラーがあります:
Caught TypeError while rendering: 'BoundField' object is not iterable
やってみましたform.myselect.all
、form.myselect.option_set
しかし、それは何も与えません
今日、私はこの問題に取り組んでおり、解決策を見つけました。はい、selectタグのオプションをテンプレートで直接反復できます。テンプレートで行う方法は次のとおりです。
<select id="id_Customer" name="Customer">
{% for x,y in form.fields.Customer.choices %}
<option value="{{ x }}"{% if form.fields.Customer.value == x %} selected{% endif %}>{{ y }}</option>
{% endfor %}
</select>
この場合、フォームにCustomerフィールドがあり、次のように選択肢が設定されています。
class Some_Form(forms.Form):
Customer = forms.ChoiceField(label=u'Customer')
def __init__(self, *args, **kwargs):
super(Some_Form, self).__init__(*args, **kwargs)
self.fields['Customer'].choices = [(e.id, e.Customer) for e in Customers.objects.all()]
お役に立てれば
動作するようになりました:
<select name="myselect" class="i-can-add-my-own-attrs-now" id="id_myselect">
{% for id, name in form.myselect.field.choices %}
<option value="{{ id }}">{{ name }}</option>
{% endfor %}
</select>
しかし、本当に、これを行うより良い方法は Django-widget-tweaks を使用することです:
{% load widget_tweaks %}
{{ form.myselect|add_class:"i-can-haz-custom-classes-easily" }}
Django-widget-tweaksでこれを実行すると、デフォルトの「selected = "selected"」が設定されます。これは非常に優れています。
私はこのようにします:
<select id="id_construction_type" name="construction_type" class="form-control input-md">
{% for value, key in form_urban.fields.construction_type.choices %}
<option value="{{ value }}"{% if form_urban.initial.construction_type == value %} selected {% endif %}>
{{ key }}
</option>
{% endfor %}
</select>
これはよりクリーンなソリューションであり、カスタムウィジェットを使用して属性を設定できます。これにより、フィールドを手動でレンダリングする必要がなくなります。
class CustomSelectWidget(forms.Select):
def create_option(self, name, value, *args, **kwargs):
option = super().create_option(name, value, *args, **kwargs)
if value:
instance = self.choices.queryset.get(pk=value) # get instance
option['attrs']['custom_attr'] = instance.field_name # set option attribute
return option
class SomeForm(forms.ModelForm):
some_field = forms.ModelChoiceField(
queryset=SomeModel.objects.all(),
widget=CustomSelectWidget
)
テンプレートでラジオボタンを使用します。
<table>
{% for x,y in form.fields.Customer.choices %}
<tr>
<td><input id="id_Customer_{{x}}" {% if form.fields.Customer.value == x %}checked="checked"{% endif %} name="Customer" type="radio" value="{{x}}" /></td>
<td>{{ y }}</td>
</tr>
{% endfor %}
</table>