编辑Django _form.as_p

use*_*469 20 django django-forms

默认_form.as._p吐出:

<p><label for="id_subject">Subject:</label>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
Run Code Online (Sandbox Code Playgroud)

而我需要

 <p><label for="id_subject">Subject:</label><p>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
Run Code Online (Sandbox Code Playgroud)

标签和输入之间的中断.如何修改我的Django代码呢?

Chr*_*att 40

你根本就不form.as_p能再使用了.如果默认值不适合您,则必须手动渲染字段:

<form action="/contact/" method="post">
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Send message" /></p>
</form>
Run Code Online (Sandbox Code Playgroud)

请参阅文档:https://docs.djangoproject.com/en/dev/topics/forms/#looping-over-the-form-s-fields


Bri*_*ket 7

覆盖表单类上的as_p.

class MyForm(forms.Form):
    def as_p(self):
        "Returns this form rendered as HTML <p>s."
        return self._html_output(
            normal_row = u'<p%(html_class_attr)s>%(label)s</p> %(field)s%(help_text)s',
            error_row = u'%s',
            row_ender = '</p>',
            help_text_html = u' <span class="helptext">%s</span>',
            errors_on_separate_row = True)
Run Code Online (Sandbox Code Playgroud)

  • 如果您想要DRY,请将模板循环移动到单独的文件中并包含它.对于这种方法而言,这不是更明确的模板内方法的论据.当你从根本上改变方法的作用时.覆盖添加其他行为的方法是一回事,但是当一个方法在10,001个Django站点上返回一个东西并且在1上返回不同的东西时,这就是一个问题. (2认同)
  • 移动ap标签"从根本上改变了方法的作用"?现实世界的决策比分类答案所暗示的要复杂得多.最佳实践经常相互冲突并且需要选择(例如,优化的代码通常不是最易读的代码).在某些组织中,与10,001个其他Django站点的兼容性实际上并不是最高优先级.许多组织如果无法修改Django的行为以满足他们的需求,就无法使用Django.为继承代码库的开发人员创建更多工作可能是可接受的成本. (2认同)

Dan*_*man 6

如果你只是需要休息一下,那么就不需要改变Django代码了.只需使用CSS样式labeldisplay: block.