2017-07-03 10 views
0

私は、カスタムマークアップをテンプレートとして出力する必要があるいくつかの選択ボックスフォームフィールドをリストとして持っています。これを行うために、現在のフォームフィールドを引数として渡すインクルードを作成しました。フォームフィールドの値と選択した値を比較する

オプションのリストをループして問題なくリストを作成できます。私の問題は、フォームラベル、または現在選択されている値のいずれかを表示するのに必要なオプションのリストの上にあることです。

{% if field.value %} 
 
    {% for value, option in field.field.choices %} 
 
     {% if value == field.value %} 
 
      {{ option }} 
 
     {% endif %} 
 
    {% endfor %} 
 
{% else %} 
 
    {{ field.label }} 
 
{% endif %}

例えば上記のコードでvalueが1であり、field.valueも1である場合には、平等のテストが機能しないとビット:これは私がこれをしなければならないコードでありますif文内のコードは実行されません。私はそれがダウンIが比較された2つの値のデータ型にあるかもしれないと推測するので、次のようにIは、整数の両方をキャストしようとした:

{% if field.value %} 
 
    {% for value, option in field.field.choices %} 
 
     {% if value|add:"0" == field.value|add:"0" %} 
 
      {{ option }} 
 
     {% endif %} 
 
    {% endfor %} 
 
{% else %} 
 
    {{ field.label }} 
 
{% endif %}

これは場合でうまく働い選択ボックスの値は整数でした。しかし、時には私の選択ボックスに値としてブール値があるので、この場合、整数キャストが適用されても比較は機能しません。

どのような種類のデータを比較していても、2つの値を安全に比較できますか?

答えて

0

私は答えを見つけたと思います。

問題は、選択された値が常に文字列であり、forloopの値が整数またはブール値(またはその他のデータ型の可能性あり)である可能性があるという点です。答えはforloopの値を文字列にキャストすることです。

{% if field.value %} 
    {% for value, option in field.field.choices %} 
     {% if value|stringformat:"s" == field.value %} 
      {{ option }} 
     {% endif %} 
    {% endfor %} 
{% else %} 
    {{ field.label }} 
{% endif %} 
関連する問題