2016-12-17 70 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