0

Djangoフォームを使用してhtmlフォームを作成しています。フォームレイアウトに特別なものが含まれているため、BoundFieldsを使用します。

フォームにRadioSelectウィジェットを含むChoicesFieldがあります。<li>:の中にimgを入れたいので、選択肢を手動で繰り返します。

<ul>
    {% for country in form.country %}
        <li>
            <img src="{{ MEDIA_URL }}country_icons/country_{{ country.value }}.png">
            {{ country }}
        </li>
    {% endfor %}
</ul>

ただし、出力には入力要素のidタグが含まれていません。

<ul>
    <li>
        <img src="/media/country_icons/country_nl.png">
        <label>
            <input type="radio" value="nl" name="country" checked="checked">
            Netherlands
        </label>
    </li>
    <li>
        <img src="/media/country_icons/country_de.png">
        <label>
            <input type="radio" value="de" name="country">
            Germany
        </label>
    </li>
</ul>

一方、オプションを繰り返し処理せずにフィールドを出力する場合は、次のようになります。

{{ form.country }}

出力します:

<ul>
    <li>
        <label for="id_country_0">
            <input id="id_country_0" type="radio" value="nl" name="country" checked="checked">
            Netherlands
        </label>
    </li>
    <li>
        <label for="id_country_1">
            <input id="id_country_1" type="radio" value="de" name="country">
            Germany
        </label>
    </li>
</ul>

したがって、私の問題は、手動で選択肢を反復処理したときにidフィールドが表示されないことです。これにより、css/javascriptセレクターに不整合が生じます。

だから私の質問は、とにかくidタグを含める方法はありますか?この動作はとにかく意図されていますか?それともこれはバグかもしれませんか?誰かが同様の種類の問題に遭遇しますか?

4

1 に答える 1

1

なぜそのように機能するのかわかりません。私の推測では、これらのIDは、フォームAPIによって作成されたイテレーターによって作成されます。単一の国はイテレータを認識していません( forループ内に表示されずにテンプレートに表示される可能性があります)。そのため、IDを作成する方法はありません。

他の質問に答えるには-はい、IDを含めるように自分で入力を作成できます。

何かのようなもの -

{% for country in form.country %}
    <li>
        <img src="{{ MEDIA_URL }}country_icons/country_{{ country.value }}.png">
        <label for="id_country_{{ forloop.counter0 }}">
            <input id="id_country_{{ forloop.counter0 }}" type="radio" value="{{ country.value }}" name={{ country }}>
        </label>
        {{ country.name }}
    </li>
{% endfor %}

テンプレートforループのドキュメントをご覧ください

于 2013-02-12T17:30:50.317 に答える