Django - 表单在发生错误后重置值

时间:2012-03-07 11:11:33

标签: django forms

我正在处理由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>

如何修改其行为,以便在出错后不会清除提供的数据?只有包含无效dada的字段才能从表单中删除。

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

2 个答案:

答案 0 :(得分:4)

您可以将form.subject.value提供给输入的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>

答案 1 :(得分: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>

您也可以尝试passing the onfocus as a widget attribute。当您使用可翻译字符串时,这可能有点复杂 - 我认为您可能必须使用表单的__init__方法设置窗口小部件。