【问题标题】:Choices in Django model not being translated, possibly due to use of modelform or modelformset?未翻译 Django 模型中的选择,可能是由于使用了 modelform 或 modelformset?
【发布时间】:2018-04-07 07:40:47
【问题描述】:

我正在开展一个 Django 项目,该项目将存在行为问题的狗与可以帮助主人克服这些问题的人联系起来。大部分项目已翻译,但有一些字符串未翻译。

以下是相关模型:

from django.utils.translation import ugettext_lazy as _

class Issue(models.Model):

    PEOPLE = 'PE'
    OWNERS = 'OW'
    EXPERIENCED_PEOPLE = 'EX'

    HELPER_CHOICES = ((PEOPLE, _('People')),
                      (OWNERS, _('Owners')),
                      (EXPERIENCED_PEOPLE, _('People with experience')))

    who_can_help = models.CharField(_('Who can help?'),
                                    blank=False,
                                    choices=HELPER_CHOICES,
                                    default=PEOPLE,
                                    max_length=2,
                                    null=False)
    doggo = models.ForeignKey(Doggo, on_delete=models.CASCADE)

以及forms.py中的相关位

IssueFormSet = modelformset_factory(Issue, fields=['title', 'description', 'plan', 'who_can_help'])

最后是视图(我省略了处理 POST 请求的部分):

def doggo_create_view(request):
    doggo_form = DoggoForm()
    issue_formset = IssueFormSet(queryset=Issue.objects.none())
    return render(request, 'doggos/doggo_form.html', {'form': doggo_form, 'formset': issue_formset})

我看到的是:

应该说“Mensen”而不是“People”(就像在 .po 文件中一样,我没有忘记编译该文件)。有什么想法吗?

【问题讨论】:

  • 你使用的是什么版本的 Django?
  • 你确定你已经激活了语言。您可以检查请求标头中的语言,看看它是否应该是正确的。
  • @solarissmoke 我在 Django 1.10.8 上。
  • @MuhammadShoaib 一些字符串被正确翻译,所以这应该不是问题。

标签: python django internationalization


【解决方案1】:

我找到了让它工作的方法。说实话,我并不了解这里发生的所有方面,但我从相关问题中一起困惑。

解决方法似乎是创建显式模型表单并使用 ChoiceField 的惰性版本。我找到了后者here 的代码。这是我的forms.py:

class LazyChoiceField(ChoiceField):
    '''
    A Lazy ChoiceField.
    This ChoiceField does not unwind choices until a deepcopy is called on it.
    This allows for dynamic choices generation every time an instance of a Form is created.
    '''
    def __init__(self, *args, **kwargs):
        # remove choices from kwargs.
        # choices should be an iterable
        self._lazy_choices = kwargs.pop('choices',())
        super(LazyChoiceField,self).__init__(*args, **kwargs)

    def __deepcopy__(self, memo):
        result = super(LazyChoiceField,self).__deepcopy__(memo)
        lz = self._lazy_choices
        if callable(lz):
            lz = lz()
        result.choices = lz
        return result

class IssueForm(forms.ModelForm):

    who_can_help = LazyChoiceField(choices=((PEOPLE, _('People')),
                                            (OWNERS, _('Owners')),
                                            (EXPERIENCED_PEOPLE, _('People with experience'))))

    class Meta:
        model = Issue
        fields = ['title', 'description', 'plan']

我从this similar issue 得到这个想法。

并不是说我不知道​​为什么会这样,而是我的头脑还没有那么敏锐,所以如果有人对为什么需要这样做以及为什么会起作用有任何进一步的见解,他们是仍然欢迎。

【讨论】:

    【解决方案2】:

    我遇到了这个问题,最终使用带有文本的简单元组

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 2013-09-19
      • 2016-04-10
      相关资源
      最近更新 更多