我使用相同的表单并更改选项。
所有选择都有翻译。
我是否需要在表单中指定一些内容?
class QuestionForm(forms.Form):
selection = forms.ChoiceField(widget=forms.RadioSelect())
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'
答案 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
对象,无法直接翻译。