首页 文章

Django表单模板定制

提问于
浏览
0

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 回答

  • 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 . 如果不使用替换正确的 .

相关问题