Django Forms 中表单渲染字段的最佳实践

问题描述 投票:0回答:1

我正在寻求优化 Django ModelForm 中表单字段的呈现并确保遵守最佳实践。目前,我已经在 ModelForm 类中实现了 as_custom_div 方法来自定义表单字段的呈现。这是我定义的方法:

def as_custom_div(self):
    output = ''
    for field in self:
        output += f'<div class="input-container">{field}</div>'
    return output

在我的模板中,我使用此方法来呈现表单字段:

<form action="">
    {{form.as_custom_div|safe}}
    <input type="submit" value="Submit">
</form>

虽然这种方法有效,但我很好奇是否有更有效或更传统的方法来达到相同的结果。我想确保遵循在 Django 中呈现表单字段的最佳实践。任何见解或替代方法将不胜感激。谢谢你!”

django django-models django-forms django-templates
1个回答
0
投票

我正在寻求优化 Django 中表单字段的渲染

ModelForm
并确保遵守最佳实践。

Python(和 Django)的想法是,程序员的便利性通常比处理时间更重要:通常雇用一些额外的程序员比购买更多的服务器容量或添加额外的机器花费更多。 Python 并不是为了以绝对最佳的方式使用 CPU 的每个周期,而是为了尝试尽可能快速、简单地实现一些东西。因此,您牺牲了一点性能来降低构建成本。

重要的是时间复杂度得到控制,因此限制算法的时间复杂度,限制数据库查询、HTTP请求、文件操作等通常比程序本身花费更多时间的次数.

Django 有一个

RenderableFormMixin
 [GitHub] 定义了不同的渲染模式:

class RenderableFormMixin(RenderableMixin):
    def as_p(self):
        """Render as <p> elements."""
        return self.render(self.template_name_p)

    def as_table(self):
        """Render as <tr> elements excluding the surrounding <table> tag."""
        return self.render(self.template_name_table)

    def as_ul(self):
        """Render as <li> elements excluding the surrounding <ul> tag."""
        return self.render(self.template_name_ul)

    def as_div(self):
        """Render as <div> elements."""
        return self.render(self.template_name_div)

因此,它可以与某些模板一起渲染整个表单,例如使用

django/forms/templates/django/forms/p.html
模板[GitHub]:

{{ errors }}
{% if errors and not fields %}
  <p>{% for field in hidden_fields %}{{ field }}{% endfor %}</p>
{% endif %}
{% for field, errors in fields %}
  {{ errors }}
  <p{% with classes=field.css_classes %}{% if classes %} class="{{ classes }}"{% endif %}{% endwith %}>
    {% if field.label %}{{ field.label_tag }}{% endif %}
    {{ field }}
    {% if field.help_text %}
      <span class="helptext"{% if field.auto_id %} id="{{ field.auto_id }}_helptext"{% endif %}>{{ field.help_text|safe }}</span>
    {% endif %}
    {% if forloop.last %}
      {% for field in hidden_fields %}{{ field }}{% endfor %}
    {% endif %}
  </p>
{% endfor %}
{% if not fields and not errors %}
  {% for field in hidden_fields %}{{ field }}{% endfor %}
{% endif %}

由于存在隐藏字段、错误、帮助文本等,它变得更加复杂。因此,要做好它是相当麻烦的。例如,此模板包含表单的

media
,因此我们需要手动执行此操作,因此最好将其包含在模板中。

但是通过使用模板,人们还可以自定义表单的呈现方式。事实上,您可以在某个应用程序的模板目录中定义一个

django/forms/p.html
来覆盖 Django 在使用
.as_p()
时渲染表单的方式,从而使渲染表单的方式更加灵活。

© www.soinside.com 2019 - 2024. All rights reserved.