Django表单模板自定义

时间:2016-12-17 00:28:17

标签: python django django-forms django-templates

django的新手(以及一般的python)。我正在尝试自定义我的一个表单,并想知道最好的方法。

以下面的例子为例,一个包含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>...

我要做的是在权重字段中在输入标记之后插入一个额外的元素并自定义text和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_foobar,其中返回self.html_output。但我发现只允许指定“normal_row”,“error_row”等值。我想为此表单编写自定义模板,并从模型上的方法返回html,然后我可以从模板中访问该模板。 (或覆盖此模型的as_p方法,以根据字段返回自定义html。)

希望这是有道理的。

1 个答案:

答案 0 :(得分: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是相关字段的正确ID。如果不使用替换正确的。