0

Django の Form Wizard パッケージを使用して 4 ステップのフォームを作成しています。4 つのステップごとにフォームを作成しました。それはうまくいっています。私の場合、4 つの個別のテンプレートを作成し、フォーム ウィザードの各ステップで独自のテンプレートを使用しています。

しかし、私が作成したこれらのテンプレートはどれも実質的に同じです。以下は、それぞれにあるコードです。他所から切り貼りしました。それは機能しますが、その方法や理由が完全にはわかりません:

<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
    {{ wizard.form.management_form }}
    X
    {% for form in wizard.form.forms %}
        {{ form }}
    {% endfor %}
{% else %}
    Y
    {{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "Previous Step" %}</button>
{% endif %}
<input type="submit" value="{% trans "Next Step" %}"/>
</form>

私がしなければならないことは、ステップ 2/4 でフォームのレイアウトを変更することです。現在のように、フォームの入力要素を互いに重ねて配置したくありません。を操作して、少し違うことをしたいです。

しかし、これを行う方法がわかりません。{{wizard.form}} だけでなく、実際の名前付きフォーム要素を使用しているテンプレートを誰かに見せてもらえますか? 検証エラーが発生した場合でも、この Web ページに表示するにはそれが必要です。それをすべて達成する方法は?テンプレートがどのように見えるかの簡単な例が理想的です。

4

1 に答える 1

0

フォームのレンダリングを制御したい場合は、フォーム フィールドを手動でレンダリングする必要があります。結局、あなたのフォームは依然として標準の Django フォームです。


しかし、私が作成したこれらのテンプレートはどれも実質的に同じです。

各ステップで同じテンプレートを繰り返すべきではありません。

代わりにテンプレートを基本テンプレートとして使用し、レイアウトをカスタマイズするステップに提供するテンプレートでこの基本テンプレートを拡張する方がクリーンです。そうすれば、特定のステップに追加の CSS や JS を簡単に埋め込むこともできます。

だから代わりに

{% for form in wizard.form.forms %}
  {{ form }}
{% endfor %}

基本テンプレートに次のブロックを作成します

{% block form %}
  {{ wizard.form }}
{% endblock %}

そうすれば、フォーム ブロックをオーバーライドするだけで、特定のステップのフォームのレンダリングをカスタマイズできます。

{% extends "base_step.html" %}
{% block form %}
  {{ wizard.form.example_field_to_show }}
  ...
{% endblock %}
于 2013-02-03T15:17:58.620 に答える