35

私は非常に単純な連絡先フォームを持っていますが、ラベルが表示されないように何らかの方法で非表示にしたいと考えていますCsrf Token。私は Flask と Flask-WTForms を使用しており、フォームを次のようにレンダリングしています。

{% for field in form %}
    {{ field.label }}
    {{ field }}
{% endfor %}

つまり、基本的にこれは私の入力を正しく表示し、csrf oen は非表示ですが、ラベルは非表示になっていませんか? 私はそれを乗り越えてform.field_name、フォームをループする代わりに暗黙のうちに言うべきですか、それともこの「コーナーケース」を処理する方法はありますか.

for ループ宣言またはラベル宣言のいずれかで論理チェックを行うことを考えていましたが、これまでのところ、機能するドキュメントは見つかりませんでした。

ありがとう

編集:私はこれを行うことで問題を「修正」しましたが、それはちょっと汚いとハッキーに感じます。

{% if not loop.first %}
    {{ field.label }}
{% endif %}
4

5 に答える 5

47

CSRFトークンだけでなく、すべての非表示フィールドで機能するより一般的なソリューションが必要な場合:

{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
  {{ field.label }}
  {{ field }}
{% endfor %}

form.hidden_tag()Flask-WTF によって提供されます。

于 2012-05-29T13:10:48.173 に答える
8

JDの優れた回答に追加するだけです...

この質問に出くわした場合:条件「if field.widget.input_type!='hidden'」をフォーム イテレータではなくラベルに追加することで、(csrf) 隠しフィールド (したがって保護) が失われるのを回避できます。

すなわち:

いいえ

{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
      {{ field.label }}
{{ field }}
{% endfor %}

しかし

{{ form.hidden_tag() }}
{% for field in form %}
  {% if field.widget.input_type != 'hidden' %} {{ field.label }} {% endif %}
  {{ field }}
{% endfor %}
于 2014-11-19T21:42:42.270 に答える
8

これもうまくいくはずだと思います:

{% for field in form if field.id != 'csrf_token' %}
    {{ field.label }}
    {{ field }}
{% endfor %}
于 2012-05-26T08:13:49.723 に答える
3

私はこのようにする方法を見つけました:

{% if field.id != 'csrf_token' %}

私はこれがそれほどハッキーではないと信じています。これは、ドキュメントの例を変更したことでわかりました。

于 2012-05-26T02:50:26.860 に答える
1

最近、WebページをリロードせずにAPIに直接送信するために、ajaxを介してフォームを送信するマクロを作成しました。

{% macro render_fields3(form, form_name, method) %}
<form class="ajax" name={{ form_name }} method={{ method }}>
{{ form.hidden_tag() }}
{% for field in form if field.widget.input_type != 'hidden' %}
    <dt>{{ field.label }}
    <dd>{{field(id=field.name + method)|safe}}
    {% if field.errors %}
      <ul class=errors>
      {% for error in field.errors %}
        <li>{{ error }}</li>
      {% endfor %}
      </ul>
    {% endif %}
    </dd>
  {% endfor %}

</form>
{% endmacro %}
于 2017-06-22T15:01:06.907 に答える