2016-12-17 83 views
0

django(以及一般的python)的新手。我試圖自定義我的一個表單,希望知道最好的方法來做到這一點。Django表單模板定製

舉例如下,一個帶有3個字段的表單,兩個用於加權輸入的字段和一個用於目標日期的字段。

class BasicFitnessGoalForm(forms.ModelForm): 

    class Meta: 
     model = BasicFitnessGoal 
     fields = ('currentWeightKg','targetWeightKg','targetDate') 
     widgets = { 
      'targetDate': forms.DateInput(attrs={'class':'formdatepicker'}), 
     } 
     labels = { 
      'currentWeightKg' : "Current Weight", 
      'targetWeightKg' : "Goal Weight", 
      'targetDate' : 'Goal Date' 
     } 

我希望能夠顯示這種形式在使用類似goalForm.as_p(),它生成HTML像下面的我的模板:

<p> 
<label></label><input><input>... 

我所希望做的是對的權重字段在輸入標籤後插入額外的元素並自定義文本和CSS類。所以我最終得到了這樣的事情:

<p> 
<label>Current Weight</label><input type=Number...><span class="customCss">Kg (or text I enter</span> 
</p> 

那麼有沒有辦法在模型類中完成這個?我知道我可以使用JavaScript或循環遍歷模板中的字段而不是使用form.as_p標記。但是我想重複使用它,所以如果我可以創建一個方法來輸出所需的html,無論我想要使用它,它都是最乾淨的。

我見過一些例子,您可以在as.html_output返回的as_foobar這樣的表單上設置一個方法。但是我發現只允許指定像「normal_row」,「error_row」等值。我想爲此表單編寫一個自定義模板,然後從模型上的方法返回html,然後我可以從模板中訪問該方法。 (或者重寫此模型的as_p方法以根據字段返回自定義html)。

希望這是有道理的。

+0

你可以創建一個自定義的[widget](https://docs.djangoproject.com/en/1.10/ref/forms/widgets/)並像在'targetDate'上一樣使用。 – Tiago

+1

我認爲一個自定義小部件是我想要的。我檢查出這個鏈接,並相信如果我重寫渲染方法,我可以生成所需的HTML,然後在我使用它的任何地方都會根據需要渲染表單。感謝您指點我正確的方向。 – hurlbz

回答

1

使用註釋中建議的自定義小部件是一種選擇,另一種是手動循環顯示字段。

<form action="/your-name/" method="post"> 
    {% csrf_token %} 
    {{ form.non_field_errors }} 
    {% for field in form %} 

     <div class="fieldWrapper"> 
      {{ field.errors }} 
      {{ field.label_tag }} {{ field }} 
      {% if field.help_text %} 
        <p class="help">{{ field.help_text|safe }}</p> 
      {% endif %} 

      {% if field.id_label = id_currentWeightKg" %} 
       <span class="customCss">Kg (or text I enter</span> 
      {% endif %} 
     </div> 
    {% endfor %} 
    <input type="submit" value="Submit" /> 
</form> 

有關更多信息,請參閱手冊中的Looping over form fields部分。

在執行此操作之前,請查看HTML源代碼並確認id_currentWeightKg是相關字段的正確標識。如果不使用正確的替換。

+0

謝謝。我想避免手動循環遍歷字段,因爲我不得不將這些代碼複製並粘貼到所有我想要使用的django模板中。聽起來像小部件選項是我所追求的。我相信通過覆蓋自定義小部件上的render()方法,我可以輸出我想要的HTML。感謝您指點我正確的方向。 – hurlbz

+0

謝謝。沒有不敬的意圖,但我沒有接受這個答案,因爲我在我的問題中特別提到我不想這樣解決問題,也不希望其他觀衆認爲這是唯一的方法(這是所有其他問題我發現說)。你確實把我指向正確的方向,所以我已經把它提升了。如果您(或任何人)想發佈一個答案,顯示自定義小部件的示例並重寫「呈現」方法。我很樂意接受。 – hurlbz