2012-06-23 43 views
2

目前我正在試驗django表單嚮導。現在基本的設置工作,我可以爲顯示可變文本的每個步驟調用不同的模板。Django表單嚮導 - 每個步驟的自定義表單佈局

現在我想進一步爲每一步創建一個自定義表單佈局。 Django的文檔顯示了一種通用的方式來顯示錶單,並始終與垂直對齊。

在我的實驗,我有兩個步驟:

  • 第1步:電子郵件地址和密碼(只有兩個領域需要垂直排列)
  • 第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 %} 

但是我這裏的問題是,我有兩個blocksform_ifform_else調用相同的形式佈局。因此,我對錶單佈局進行了雙重維護。

有沒有更好的方法來實現我想要實現的目標?

謝謝!

親切的問候

+0

如果您在每一步中只顯示一個表單,那麼您只需要form_else。在這種情況下,您可以顯着簡化您的模板。你不能嗎? – sergzach

回答

2

基於羅漢輸入以下post,我發現了一個工作的解決方案:

我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 %} 

使用它可以讓位置無需每個步驟只維護一個表單佈局而不是兩個。

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等,只要你想。 提示:對於模板中的通用代碼(即管理表單字段),創建不同的模板並將其包含在每個步驟表單中。

+0

嗨Rohan,thx已經在反饋。事實上,我已經爲每一步調用了不同的模板。每個代碼都用特定的表單填充我的代碼中的'block form_if'和'block form_else'標記。但目前,我在模板中複製了兩次表單(每個模塊一個表單),因爲我無法在模板中使用同一個模塊兩次=>給出錯誤。如果你有解決方案,我會很感激:)乾杯! –

0

試着給crispy-forms一看。簡而言之,您將在表單上設置一個helper實例屬性,它可以非常控制大部分您想要在不觸摸模板代碼的情況下構建表單而完成的工作。

在某些情況下,如果最終不得不自己編寫整個標記,則在某些情況下,自定義表單的演示文稿會導致難以使用的模板。在這裏,您可以在應用程序中的form_helpers.py模塊中隔離和構造混亂。

如果您可以使用crispy-forms在創建表單佈局方面的工作,您會發現需要約10行代碼來定義表單幫助程序的佈局,從而避免了數十行模板代碼否則必須保持。

你最終會遇到的情況是擁有多個表單,每個特定表單的表單助手實例和一個只調用crispy-form標記的單個模板來呈現嚮導爲每個步驟提供的表單。

+0

嗨菲利普,thx爲輸入。不完全是我正在尋找的答案,但我絕對會檢查這個應用程序了。謝謝! –

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 %}