Лучшие практики рендеринга полей формы в Django Forms
Я хочу оптимизировать отрисовку полей формы в Django ModelForm и обеспечить соблюдение лучших практик. В настоящее время я реализовал метод as_custom_div в классе ModelForm для настройки рендеринга полей формы. Вот метод, который я определил:
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
ModelForm
и обеспечить соблюдение лучших практик.
Идея Python (и Django) заключается в том, что удобство программиста зачастую важнее времени обработки: обычно нанять несколько дополнительных программистов стоит дороже, чем купить немного больше серверных мощностей или добавить дополнительную машину. Python создан не для того, чтобы тратить каждый цикл процессора абсолютно оптимальным образом, а для того, чтобы попытаться реализовать что-то как можно быстрее и проще. Поэтому вы немного жертвуете производительностью, чтобы снизить затраты на его создание.
Важно, чтобы временная сложность была под контролем, поэтому ограничивайте временную сложность алгоритмов, а также количество запросов к базе данных, 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()
, это, таким образом, делает его более гибким, как отображать форму.