【发布时间】:2014-11-07 20:56:22
【问题描述】:
由于这个原因,我已经有一段时间避免在 Django 中使用表单了,我觉得这可能是一种不好的做法。在 Django 中呈现表单时,一切都是自动化的。这会阻止您有条件地呈现或隐藏表单的某些部分,将不同的 css 类附加到该表单等。
以尽可能动态的方式使用 Django 表单的正确方法是什么?
【问题讨论】:
标签: python django django-forms
由于这个原因,我已经有一段时间避免在 Django 中使用表单了,我觉得这可能是一种不好的做法。在 Django 中呈现表单时,一切都是自动化的。这会阻止您有条件地呈现或隐藏表单的某些部分,将不同的 css 类附加到该表单等。
以尽可能动态的方式使用 Django 表单的正确方法是什么?
【问题讨论】:
标签: python django django-forms
我的回答基于Rainy 的内容并参考this 和this,我的回答是
sudo pip install django-widget-tweaks
要在您的项目中启用 widget_tweaks,您需要将其添加到项目 settings.py 文件中的 INSTALLED_APPS:
INSTALLED_APPS = [
...
'widget_tweaks',
...
]
我会将它包含在我要呈现的表单的所有模板文件的开头。
{% load widget_tweaks %}
并按如下方式呈现我的表单:
<form method="post" action="">
{% csrf_token %}
{% for fld in form %}
<div class="form-group">
{% for error in fld.errors %}<p class="help-block text-danger">{{ error }}</p>{% endfor %}
<label>{{ fld.label }}</label>
{% render_field fld class+="form-control" %}
<p class="help-block">{{ fld.help_text|safe }}</p>
</div>
{% endfor %}
<button type="submit" class="btn btn-success">{% trans 'Submit' %}</button>
</form>
【讨论】:
首先,绝对不要回避表格。事实上,总是在 django 中使用表单。它们使用简单,没有理由不使用。
表单具有足够的灵活性,可以根据需要为您提供尽可能多的控制权。
通常你会想做这样的事情:
<form action="/myurl/" method="post">
{% csrf_token %}
{% for fld in form %}
{{ fld.label }} {{ fld }} {{ fld.help_text }} {{ fld.error }}
{% endfor %}
<input type="submit" value="Submit" />
</form>
您可能还想将字段包装在 div 或表格中。您还可以测试 fld.name 以根据字段名称执行自定义操作。
【讨论】:
<input autofocus="autofocus" id="id_login" name="login" placeholder="E-mail address" type="email">,但我想将其呈现为<input type="email" name="email_address" class="form-control" placeholder="Email Address"/>,特别是使用该css 类和占位符值。您如何更改特定表单字段上的内容?
我和你在同一条船上,吉姆,我目前正在查看https://docs.djangoproject.com/en/dev/ref/forms/widgets/。这似乎是自定义字段的一个很好的起点。
至于有条件地显示/隐藏元素,如果您希望在表单加载时完成此操作(即,预先确定的表单布局,您可以按照这个 SO answer 解释对表单的 init 的更改:Conditionally show and hide a form field and set the field value
或者,如果您的意思是如何在表单完成时根据其他选择在上下文中执行此操作,那么到目前为止我发现的唯一方法是使用表单呈现的模板加载一些自定义 jQuery在。如果有办法做到这一点,我也想知道:)
【讨论】: