Django - 表单在出错后会重置数值

4
我正在处理一个多语言表单,通过 i18n 进行翻译,但我遇到了一个问题。
当我使用 {{ form.as_p }} 生成表单时,如果提供无效数据给表单,之前提供的数据不会从表单中清除 - 我希望我的自定义表单也有相同的行为,同时它将包含一些翻译后的字段。
这是我的自定义表单:
<div class="">
{{ form.subject.errors }}
<input class="contact_form" id="id_subject"
type="text" name="subject"
onfocus="if(this.value=='{% trans "Title" %}') this.value=''"
value="{% trans "Title" %}"
maxlength="128" />
</div>

我如何修改其行为,使其在出现错误后不清除所提供的数据?只有包含无效数据的字段应从表单中删除。

我在django文档中找不到任何关于这个问题的内容。

2个回答

4
你可以将“form.subject.value”提供给输入框的值元素。
<div class="">
{{ form.subject.errors }}
<input class="contact_form" id="id_subject"
type="text" name="subject"
onfocus="if(this.value=='{% trans "Title" %}') this.value=''"
value="{% if form.subject.value %}{{ form.subject.value }}{% else %}{% trans "Title" %}{% endif %}"
maxlength="128" />
</div>

3

Sander的回答是正确的,但如果可能的话,您应该尝试避免在模板中手动渲染表单字段。在这种情况下,您可以在定义表单时设置初始值:

from django.utils.translation import ugettext_lazy, ugettext as _

class MyForm(forms.Form):
    subject = Forms.CharField(initial=_("Title"), max_length=128))

你可以编写一些JavaScript来处理onfocus事件。这是一个未经测试的代码片段,使用jQuery .focus()方法。
<script type="text/javascript">
$(function() {
  $('#id_subject').focus(function() {
    if (this.value == '{{ form.subject.initial }}') {
      this.value = '';
    }
  });
});
</script>

你也可以尝试将onfocus作为小部件属性传递(passing the onfocus as a widget attribute)。由于您正在使用可翻译的字符串,这可能有点复杂-我认为您可能需要在表单的__init__方法中设置小部件。

好的,我按照你说的使用了ugettext。然而,我仍然不知道如何为我的表单字段设置“onfocus”。我需要更多的帮助。 - Efrin
我添加了一个 jQuery 代码片段。我没有时间测试它,所以你需要自己调试它。祝你好运! - Alasdair
谢谢。我明天会检查一下。 - Efrin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接