【问题标题】:Editing Django _form.as_p编辑 Django form.as_p
【发布时间】:2011-12-07 20:40:13
【问题描述】:

默认情况下 _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 代码呢?

【问题讨论】:

  • 您尝试编写的内容不是 xml 有效的。

标签: django django-forms


【解决方案1】:

您根本无法再使用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>

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

【讨论】:

    【解决方案2】:

    如果您只需要休息一下,那么就无需更改 Django 代码。只需使用 CSS 将label 设置为display: block

    【讨论】:

      【解决方案3】:

      在你的表单类上覆盖 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)
      

      【讨论】:

      • 我想在覆盖 as_p 或遍历模板中的表单字段之间进行选择将取决于各种特定于项目的因素。如果您需要所有表单都以这种方式显示,那么当您以后想要调整显示时,遍历模板中的表单字段可能会成为维护负担。覆盖 as_p 可能是也可能不是 OP 的最佳解决方案,但我怀疑这是“一般”的错误方法。
      • 它改变了预期的行为。诚然,微小的改变可能无关紧要,但它为以后进行更大更剧烈的改变开创了先例。作为一个继承了让最糟糕的 PHP 开发人员发笑的 Django 代码的开发人员,我可以说约定和预期行为对于设计良好的应用程序绝对至关重要。任何 Django 开发人员,无论何时何地,都应该能够坐下来处理您的代码并立即使用它。如果这不可能,那你就做错了。那和“显式胜于隐式”。这是 Python 的核心咒语。
      • 如果你想要 DRY,然后将模板循环移动到一个单独的文件中并包含它。与更明确的模板内方法相比,这不是这种方法的论据。当你从根本上改变方法的作用时。重写一个方法来添加额外的行为是一回事,但是当一个方法在 10,001 个 Django 站点上返回一个东西而在 1 个网站上返回一个不同的东西时,那就是个问题了。
      • 移动 p 标签“从根本上改变了方法的作用”?现实世界的决策比您的明确答案所暗示的要复杂得多。最佳实践经常相互冲突,需要选择(例如,优化的代码通常不是最易读的代码)。在某些组织中,与 10,001 个其他 Django 站点的兼容性实际上并不是最高优先级。如果许多组织不能修改 Django 的行为以满足他们的需要,他们就不能使用 Django。为继承代码库的开发人员创造更多工作可能是可以接受的成本。
      • 这是一个非常好的方法!!我只是在基类上使用不同的方法名称。此外,下划线访问对于类本身并没有错,但对其他人来说也是如此。
      【解决方案4】:

      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)
      

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

      【讨论】:

        【解决方案5】:

        模板:

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

        CSS:

        #my_form p label,
        #my_form p input{
            float: left;
            clear: left;
        }
        

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

        【讨论】:

        • 我喜欢这种通过操纵标签本身来操纵 as_p 呈现方式的想法,尽管我认为这可能违背 css 的精神。
        猜你喜欢
        • 2019-12-18
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 2021-06-12
        • 2020-07-24
        • 2016-01-09
        • 2018-07-30
        相关资源
        最近更新 更多