如何翻译动态表单选择

时间:2013-04-18 16:51:43

标签: python django python-2.7 django-i18n

我使用相同的表单并更改选项。

所有选择都有翻译。

我是否需要在表单中指定一些内容?

forms.py

class QuestionForm(forms.Form):
    selection = forms.ChoiceField(widget=forms.RadioSelect())

views.py

from django.utils.translation import ugettext as _
form = QuestionForm(request.POST)
choices = [(_(i.choice), i.choice) for i in question.choices.all()]
form.fields['selection'].choices = choices

模板

<form method="post">{% csrf_token %}
    {{ form.selection }}
    <input type="submit" value="Submit" class="btn"/>
</form>

我试过

{% trans form.selection %}

但得到错误“

'BoundField' object has no attribute 'replace'

2 个答案:

答案 0 :(得分:1)

(_(i.choice), i.choice)顺序错误,您将看不到翻译。这是显示的第二个项目,因此您希望拥有:(i.choice, _(i.choice))


此外,如果您需要动态表单,则应使用表单工厂创建动态表单。

创建后不要使用表单内部。

代码中的某处:

def make_question_form_class(question):
     choices = [(_(i.choice), i.choice) for i in question.choices.all()]

     class _QuestionForm(forms.Form):
         selection = forms.ChoiceField(choices = choices, widget=forms.RadioSelect())

     return _QuestionForm

在您看来:

form_class = make_question_form_class(question)
form = form_class(request.POST)

有关更多可能性,请参阅this post by James Bennett himself

答案 1 :(得分:0)

翻译需要在模板渲染时进行。为此,您需要在运行时设置正确的语言(如何实现这取决于运行代码的确切上下文):

choices = [(_(i.choice), i.choice) for i in question.choices.all()]

或者使用ugettext_lazy,它不会翻译选项,而是将翻译推迟到渲染时间:

from django.utils.translation import ugettext_lazy as _
choices = [(_(i.choice), i.choice) for i in question.choices.all()]

在模板中,始终使用:

<form method="post">{% csrf_token %}
    {{ form.selection }}
    <input type="submit" value="Submit" class="btn"/>
</form>

form.selection对象是BoundField对象,无法直接翻译。