Django 表单模板自定义

Posted

技术标签:

【中文标题】Django 表单模板自定义【英文标题】:Django form template customization 【发布时间】:2017-05-02 19:57:27 【问题描述】:

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>...

我要做的是在权重字段上在输入标签之后插入一个额外的元素并自定义文本和 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)。

希望这是有道理的。

【问题讨论】:

您可以创建一个自定义widget 并像在targetDate 上使用一样使用。 我认为自定义小部件是我想要的。我检查了该链接,并相信如果我覆盖渲染方法,我可以生成所需的 HTML,然后表单将在我使用它的任何地方按照需要呈现。感谢您为我指明正确的方向。 【参考方案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。如果不使用替换为正确的。

【讨论】:

谢谢。我想避免手动遍历字段,因为我必须将此代码复制并粘贴到我想要使用它的所有 django 模板中。听起来小部件选项就是我所追求的。我相信通过覆盖自定义小部件上的 render() 方法,我可以输出我想要的 HTML。感谢您为我指明正确的方向。 谢谢。没有不尊重的意思,但我不接受这个答案,因为我在我的问题中特别提到我不想以这种方式解决它,也不希望其他观众认为这是唯一的方法(这是所有其他 SO 问题我发现说)。你确实为我指明了正确的方向,所以我投了赞成票。如果您(或任何人)想发布一个答案,显示自定义小部件和覆盖的“渲染”方法的示例。我很乐意接受。

以上是关于Django 表单模板自定义的主要内容,如果未能解决你的问题,请参考以下文章

django 表单向导中的自定义模板 - NameError

使用自定义模板时 Django 表单字段的初始值

Django 中的自定义表单集模板

如何将 Django 的内置身份验证与自定义表单(html 模板)一起使用

Django - 自定义表单,特别是字段的外观

Django-Admin:集成自定义表单