编辑Django_form.as_p

编辑Django_form.as_p,django,django-forms,Django,Django Forms,默认情况下_form.as._p吐出: <p><label for="id_subject">Subject:</label> <input id="id_subject" type="text" name="subject" maxlength="100" /></p> 主题: 而我需要 <p><label for="id_subject">Subject:</label><p

默认情况下_form.as._p吐出:

<p><label for="id_subject">Subject:</label>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
主题:

而我需要

 <p><label for="id_subject">Subject:</label><p>
    <input id="id_subject" type="text" name="subject" maxlength="100" /></p>
主题:


标签和输入之间有一个中断。我如何修改Django代码才能做到这一点?

您只是不能再使用
表单了。如果默认设置不适用于您,则必须手动渲染字段:

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

{%形式的字段为%}
{{field.errors}}
{{field.label_tag}}:{{{field}
{%endfor%}


请参阅文档:

如果您只需要休息一下,则无需更改Django代码。只需使用CSS将
标签
样式设置为
显示:块

覆盖表单类上的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)
类MyForm(forms.Form):
def组件(自身):
“返回呈现为HTMLs的表单。”
返回self.\u html\u输出(
正常_行=u%(标签)s

%(字段)s%(帮助_文本)s', 错误\u行=u'%s', 行结束符=“

”, 帮助\u文本\u html=u'%s', 错误\u在\u单独的\u行=真)
模板:

<div id="my_form">
    {{ form.as_p }}
</div>

所以,如果您添加了字段,您仍然可以使用form.as_p

和Brian上面描述的差不多。我会为你的表单写一个新的方法,比如as_myp。这是我自己做的。我采用as_table方法,并使as_plain删除tr/th标记。前

class MyForm(forms.Form):
    my_field1 = forms.CharField(...)
    my_field2 = forms.WhateverField(...)

    def as_myp(self):
        "Returns this form rendered as HTML <p>s."
        return self._html_output(
            normal_row = '<p%(html_class_attr)s>%(label)s</p> <p>%(field)s%(help_text)s</p>',
            error_row = '%s',
            row_ender = '</p>',
            help_text_html = ' <span class="helptext">%s</span>',
            errors_on_separate_row = True)

    def as_plain(self):
        "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
        return self._html_output(
            normal_row = '%(label)s%(errors)s%(field)s%(help_text)s',
            error_row = '%s',
            row_ender = ' ',
            help_text_html = '<br /><span class="helptext">%s</span>',
            errors_on_separate_row = False)
类MyForm(forms.Form):
my_field1=forms.CharField(…)
my_field2=forms.WhateverField(…)
def as_myp(自我):
“返回呈现为HTMLs的表单。”
返回self.\u html\u输出(
正常行='(标签)s

%(字段)s%(帮助文本)s

', 错误\行=“%s”, 行结束符=“

”, 帮助\u文本\u html='%s', 错误\u在\u单独的\u行=真) def作为普通(自): “返回呈现为HTML s的表单--不包括。” 返回self.\u html\u输出( 正常_行='%(标签)s%(错误)s%(字段)s%(帮助_文本)s', 错误\行=“%s”, 第二行=“”, help_text_html='
%s', 错误(在单独的行上=错误)

这样做似乎比编写模板文件和处理带有错误、标记、可见/隐藏等的表单字段渲染更容易。

我想,在模板中重写as\p或迭代表单字段之间的选择将取决于各种项目特定的因素。如果您需要以这种方式显示所有表单,那么当您以后想要调整显示时,在模板中迭代表单字段可能会成为维护负担。重写as_p可能是,也可能不是OP的最佳解决方案,但我怀疑它“总体上”是错误的方法。当它改变预期行为时。诚然,小小的改变可能无关紧要,但它为以后做出更大更剧烈的改变树立了先例。作为一个继承了Django代码的开发人员,这会让最差的PHP开发人员发笑,我可以说,惯例和预期的行为对于一个设计良好的应用程序来说绝对至关重要。任何Django开发人员,无论何时何地,都应该能够坐下来处理您的代码并立即使用它。如果那不可能,那你就错了。“显式比隐式好。”这是Python的核心口号。如果您想要干燥,那么将模板循环移动到一个单独的文件中并包含它。与模板方法中更显式的方法相比,这不是该方法的一个论点。当你从根本上改变方法的作用时。重写一个方法来添加额外的行为是一回事,但是当一个方法在10001 Django站点上返回一件事而在1上返回另一件事时,这就是一个问题。移动一个p标记“从根本上改变了该方法的功能”?现实世界中的决策比你的直截了当的回答更复杂。最佳实践常常相互冲突,需要选择(例如,优化的代码通常不是可读性最好的代码)。在一些组织中,与10001个其他Django站点的兼容性实际上不是最高优先级。如果许多组织不能修改Django的行为以满足其需求,那么它们就不能使用Django。为继承代码库的开发人员创建更多工作的成本可能是可以接受的。这是一个非常好的方法!!我只想在基类上使用不同的方法名。此外,下划线访问对类本身并没有错,但对其他类来说是错的。您试图编写的内容不是xml有效的。我喜欢通过操纵标记本身来操纵as_p呈现方式的想法,尽管我认为这可能违背css的精神。
class MyForm(forms.Form):
    my_field1 = forms.CharField(...)
    my_field2 = forms.WhateverField(...)

    def as_myp(self):
        "Returns this form rendered as HTML <p>s."
        return self._html_output(
            normal_row = '<p%(html_class_attr)s>%(label)s</p> <p>%(field)s%(help_text)s</p>',
            error_row = '%s',
            row_ender = '</p>',
            help_text_html = ' <span class="helptext">%s</span>',
            errors_on_separate_row = True)

    def as_plain(self):
        "Returns this form rendered as HTML <tr>s -- excluding the <table></table>."
        return self._html_output(
            normal_row = '%(label)s%(errors)s%(field)s%(help_text)s',
            error_row = '%s',
            row_ender = ' ',
            help_text_html = '<br /><span class="helptext">%s</span>',
            errors_on_separate_row = False)