1

我正在使用相同的表格并更改选择。

所有选项都有翻译。

我需要在表格中指定一些内容吗?

表格.py

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

视图.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'
4

2 回答 2

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)

有关更多可能性,请参阅James Bennett 本人的这篇文章!

于 2013-04-18T16:59:33.530 回答
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不能直接翻译。

于 2013-04-18T17:07:21.070 回答