Как правильно локализовать поля в формах? - PullRequest
1 голос
/ 17 марта 2020

Я использую Django 3.0.4 и Хрустящие формы 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)

А template:

{% 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

Что не так?

1 Ответ

1 голос
/ 23 марта 2020

Django документация рекомендует использовать gettext_lazy для подробных имен полей модели.

Это важно, когда вызовы этих функций расположены в путях кода, которые выполняются во время загрузки модуля.

Это может легко произойти при определении моделей, форм и форм моделей, поскольку Django реализует их так, что их поля на самом деле являются атрибутами уровня класса. Поэтому обязательно используйте ленивые переводы в следующих случаях:

Поля модели и отношения verbose_name и help_text значения параметров

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...