2

現在、私はdjangoフォームウィザードを試しています。これで基本的な設定が機能し、可変テキストを表示するステップごとに異なるテンプレートを呼び出すことができます。

次に、さらに一歩進んで、ステップごとにカスタマイズされたフォームレイアウトを作成します。Djangoのドキュメントには、常に垂直方向に配置されたフォームを表示する一般的な方法が示されています。

私の実験では、2つのステップがあります。

  • ステップ1:電子メールとパスワード(垂直方向の配置が必要な2つのフィールドのみ)
  • ステップ2:個人データ:住所、職業、..。

したがって、ステップ2では、完全に異なるフォームレイアウトを使用し、次にステップ1:フィールドセットを使用して、フィールドの水平方向の配置(住所:番地と番号など)、...

djangoのドキュメントから始めて、以下が機能すると思います(まだテストしていません):

{% block content %}
# block step: variable text for each step
{% block step %}{% endblock %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
    {{ wizard.form.management_form }}
    {% for form in wizard.form.forms %}
        # block form_if: shows a complete customized form layout for each step
        {% block form_if %}{% endblock %}
    {% endfor %}
{% else %}
    # block form_else: shows a complete customized form layout for each step
    {% block form_else %}{% endblock %}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{% trans    "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{% trans "prev step" %}</button>
{% endif %}
<input type="submit" value="{% trans "submit" %}"/>
</form>
{% endblock %}

しかし、ここで私が抱えている問題は、2つあることですblocksform_ifそしてform_else同じフォームレイアウトを呼び出しています。そのため、フォームレイアウトを二重にメンテナンスします。

私が達成したいことを達成するためのより良い方法はありますか?

ありがとう!

敬具

4

4 に答える 4

2

Rohanの入力と次の投稿に基づいて、私は実用的な解決策を見つけました:

私のbase_wizardテンプレートは次のようになります。

<form enctype="multipart/form-data" action="" method="post">{% csrf_token %}
    <table>
        {{ wizard.management_form }}
        {% if wizard.form.forms %}
            {{ wizard.form.management_form }}
            {% for form in wizard.form.forms %}
                <!-- block below accesses a customized form layout for each step -->
                {% block form_if %}{% endblock %}
            {% endfor %}
        {% else %}
            <!-- block below accesses a customized form layout for each step -->
            <!-- using the with statement makes it possible to use the same layout used in the form_if block -->
            {% with form=wizard.form %}
            {% block form_else %}{% endblock %}
            {% endwith %}
        {% endif %}
    </table>
    {% if wizard.steps.prev %}
    <button name="wizard_goto_step" value="{{ wizard.steps.first }}" class="button">{% trans "first step" %}</button>
    <button name="wizard_goto_step" value="{{ wizard.steps.prev }}" class="button">{% trans "prev step" %}</button>
    {% endif %}
    <div>
        <input type="submit" value="{% trans "submit" %}" class="button"/>
    </div>  
</form>

ステップごとのテンプレートでは、次のコードを使用します。

{% extends "base_wizard.html" %}

{% block form_if %}{% block form_else %}
    <fieldset>
        <legend>Title</legend>
        <div>
            <label>{{ form.field.label }}:<p class="note">{{ form.field.help_text }}</p></label> {{ form.field }}
            <p class="error">
                {% if form.field.errors %}
                    {% for error in form.field.errors %}
                        {{ error }}
                    {% endfor %}
                {% endif %}
            </p>
        </div>
    </fieldset>
{% endblock %}{% endblock %}

これを使用すると、ステップごとに2つではなく1つのフォームレイアウトを維持できます。

于 2012-06-24T10:01:45.230 に答える
1

ステップごとに異なるテンプレートを作成できます。テンプレートは、必要に応じてhtmlを生成できます。

ステップに異なるフォームテンプレートを使用するようにdjangoに指示するには、次のようにします...

class TestFormWizard(SessionWizardView):

    def get_template_names(self):
        if self.steps.current == 1:
            return 'step1_form.html'
        if self.steps.current == 2:
            return 'step2_form.html'
        return 'wz_form.html'

step1_form.html、step2_form.htmlなどを必要に応じて定義できます。ヒント:テンプレート(つまり、管理フォームフィールド)の一般的なコードについては、さまざまなテンプレートを作成し、ステップごとのフォームに含めます。

于 2012-06-23T18:00:56.870 に答える
1

その場合は、テンプレートで「with」ステートメントを使用できます。次のようなものです。block_ifとblock_elseで、フォームをmyformとして参照します。

{{ wizard.management_form }}
{% if wizard.form.forms %}
    {{ wizard.form.management_form }}
    {% for form in wizard.form.forms %}
        # block form_if: shows a complete customized form layout for each step
        {% with myform=form %}
        {% block form_if %}{% endblock %}
        {%e endwith %}
    {% endfor %}
{% else %}
    # block form_else: shows a complete customized form layout for each step
    {% with myform=form %}    
    {% block form_else %}{% endblock %}
    {% endwith %}
{% endif %}
于 2012-06-24T08:31:32.247 に答える
0

サクサクした形を見てみてください。簡単に言うとhelper、フォームにインスタンス属性が設定されており、テンプレートコードに触れることなく、フォームを構造化することで達成したいことのほとんどをほぼ制御できます。

場合によっては、フォームのプレゼンテーションをカスタマイズすると、マークアップ全体を自分で手書きする必要がある場合に、扱いにくいテンプレートになります。form_helpers.pyここでは、アプリケーションのモジュール内の混乱を分離して構造化できます。

フォームレイアウトの作成に関して提供されるものを使用できる場合はcrispy-forms、フォームヘルパーのレイアウトを定義するために必要な約10行のコードにより、他の方法では必要となる数十行のテンプレートコードが削除されることがわかります。維持。

最終的には、複数のフォーム、特定のフォームごとのフォームヘルパーインスタンス、およびcrispy-form各ステップにウィザードが提供するフォームをレンダリングするためのタグを呼び出す単一のテンプレートがあります。

于 2012-06-23T18:12:53.017 に答える