django - 如何正确本地化表单中的字段?

标签 django localization

我使用 Django 3.0.4 和 Crispy Forms 1.9.0

我有以下模型:

class App(models.Model):
    name = models.CharField(max_length=256, db_index=True, verbose_name=_('Name'))
    platform = models.ForeignKey(Platform, on_delete=models.CASCADE, verbose_name=_('Platform'))
    package_name = models.CharField(max_length=512, unique=True, verbose_name=_('Package name'))
    created_at = models.DateTimeField(auto_now_add=True, db_index=True, verbose_name=_('Created Date'))

表格:

class CreateAppForm(forms.ModelForm):
    class Meta:
        model = App
        fields = ('name', 'platform', 'package_name',)
        localized_fields = '__all__' # I've tried to enumerate fields as tuple
        # labels = { # I've tried to uncomment it
        #     'name': _('Name'),
        #     'platform': _('Platform'),
        #     'package_name': _('Package name'),
        # }

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        self.fields['platform'].queryset = Platform.objects.filter(is_enabled=True)

和模板:

{% extends 'base.html' %}

{% load i18n %}
{% load crispy_forms_tags %}

{% block title %}{% trans "Create application" %}{% endblock %}
{% block page_title %}{% trans "Create application" %}{% endblock %}

{% block content %}
    <div class="row">
        <div class="col">
            <div class="card shadow mb-4">
                <div class="card-header py-3">
                    <h6 class="m-0 font-weight-bold text-primary">{% trans "Create application" %}</h6>
                </div>
                <div class="card-body">
                    <form class="form" action="{% url 'apps:create' %}" method="post">
                        {% csrf_token %}

                        {{ form|crispy }}

                        <button class="btn btn-success btn-lg" type="submit"><i class="fa fa-check"></i> {% trans "Create" %}</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
{% endblock %}

.po 文件中的所有字符串都已本地化和编译(并且可以在除表单之外的任何地方工作)。

表单呈现正确,但字段的标签未本地化:

enter image description here

出了什么问题?

最佳答案

Django 文档建议使用 gettext_lazy用于模型字段的详细名称。

This is essential when calls to these functions are located in code paths that are executed at module load time.

This is something that can easily happen when defining models, forms and model forms, because Django implements these such that their fields are actually class-level attributes. For that reason, make sure to use lazy translations in the following cases:

Model fields and relationships verbose_name and help_text option values

关于django - 如何正确本地化表单中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60714086/

相关文章:

django.core.exceptions.FieldError : Unknown field(s) (y, b, d, o)

java - 防止 java 本地化 SimpleDateFormat 输出

java - 更改默认区域设置语言 android

python - 如何有效地将数据从 geopandas 保存到 django(从 shapely 转换为 geodjango)?

django - 如何在模板中显示BooleanField名称?

django - 获取外键和相应的字段值到模型中

python - mongoengine ReferenceField 的奇怪之处

mysql - 本地化现有数据库

xcode - "Your binary is not optimized for iPhone 5"在我使用 xcode 6.0.1 上传应用程序后

java - 在 Java/Spring 中,如何优雅地处理缺失的翻译值?