国际化基于Django类的通用视图(CreateView)?

时间:2016-05-27 04:28:29

标签: django internationalization django-generic-views

我使用的是Django 1.9 class-based generic views,例如CreateView。当我访问“创建”页面时,某些部分被翻译(在我的示例中为法语),所以我知道我的配置和连线是正确的,但表单字段(由视图自动命名)不是(即form.as_p )。

如何从翻译文件中获取表单字段? (例如,“名称”是一个已翻译但未被form.as_p获取的字段。

一个答案是使用{%trans%}标记在模板中单独列出字段。我本来希望避免这种情况。

我的例子类似于the docs中的例子,所以让我在这里重复一下这个例子。首先,代码:

from django.views.generic.edit import CreateView
from myapp.models import Author

class AuthorCreate(CreateView):
    model = Author
    fields = ['name']

然后显示模板:

<form action="" method="post">{% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="Save" />
</form>

1 个答案:

答案 0 :(得分:2)

查看Lazy Translation

  

当对这些函数的调用位于在模块加载时执行的代码路径中时,这是必不可少的。

     

在定义modelsformsmodel forms时很容易发生这种情况,因为Django会实现这些,以便它们的字段实际上是class-level属性。

因此,如果您有表单,可以使用ugettext_lazy进行翻译:

from django.db import models
from django.utils.translation import ugettext_lazy as _

class MyThing(models.Model):
    name = models.CharField(help_text=_('This is the help text'))
  

您可以使用ForeignKey选项将ManyToManyFieldOneToOneFieldverbose_name关系的名称标记为可翻译:

class MyThing(models.Model):
    kind = models.ForeignKey(
        ThingKind,
        on_delete=models.CASCADE,
        related_name='kinds',
        verbose_name=_('kind'),
    )