我正在处理由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文档中找不到任何关于该问题的内容。
答案 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__
方法设置窗口小部件。