Django: форма аутентификации переведена только локально?

#django

#django

Вопрос:

Я использую Authentication форму по умолчанию из Django.

Это реализация Django AuthenticationForm по умолчанию:

 from django.contrib.auth.forms import AuthenticationForm 
  

Я перевел error_messages по умолчанию на испанский:

 error_messages = {
            'invalid_login': _(
                "- Por favor, ingrese un nombre de usuario y contraseña correctos. "
                "- Diferencie entre minúsculas y mayúsculas."
            ),
  

Однако, когда приложение загружается в рабочую среду (Heroku), эти изменения не видны (похоже, что они были применены только локально).

Почему?

 class AuthenticationForm(forms.Form):
    """
    Base class for authenticating users. Extend this to get a form that accepts
    username/password logins.
    """
    username = UsernameField(widget=forms.TextInput(attrs={'autofocus': True}), label="Usuario")
    password = forms.CharField(
        label=_("Contraseña"),
        strip=False,
        widget=forms.PasswordInput,
    )

    error_messages = {
        'invalid_login': _(
            "- Por favor, ingrese un nombre de usuario y contraseña correctos. "
            "- Diferencie entre minúsculas y mayúsculas."
        ),
        'inactive': _("Esta cuenta no está activa."),
    }

    def __init__(self, request=None, *args, **kwargs):
        """
        The 'request' parameter is set for custom auth use by subclasses.
        The form data comes in via the standard 'data' kwarg.
        """
        self.request = request
        self.user_cache = None
        super().__init__(*args, **kwargs)

        # Set the max length and label for the "username" field.
        self.username_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD)
        self.fields['username'].max_length = self.username_field.max_length or 254
        if self.fields['username'].label is None:
            self.fields['username'].label = capfirst(self.username_field.verbose_name)

    def clean(self):
        username = self.cleaned_data.get('username')
        password = self.cleaned_data.get('password')

        if username is not None and password:
            self.user_cache = authenticate(self.request, username=username, password=password)
            if self.user_cache is None:
                raise self.get_invalid_login_error()
            else:
                self.confirm_login_allowed(self.user_cache)

        return self.cleaned_data

    def confirm_login_allowed(self, user):
        """
        Controls whether the given User may log in. This is a policy setting,
        independent of end-user authentication. This default behavior is to
        allow login by active users, and reject login by inactive users.

        If the given user cannot log in, this method should raise a
        ``forms.ValidationError``.

        If the given user may log in, this method should return None.
        """
        if not user.is_active:
            raise forms.ValidationError(
                self.error_messages['inactive'],
                code='inactive',
            )

    def get_user(self):
        return self.user_cache

    def get_invalid_login_error(self):
        return forms.ValidationError(
            self.error_messages['invalid_login'],
            code='invalid_login',
            params={'username': self.username_field.verbose_name},
        )
  

Комментарии:

1. Переводятся ли метки? например label=_("Contraseña")

2. Локально да, но не вижу этих изменений в реальном времени в Интернете (размещенном на Heroku)

Ответ №1:

Причина в том, что когда вы переходите к Heroku, это не приводит к изменениям, которые вы внесли в реализацию по умолчанию. Вместо этого устанавливается версия Django по умолчанию, указанная в вашем requirements.txt . Итак, что вы можете сделать вместо этого, это создать пользовательскую форму аутентификации, которая наследуется от реализации Django по умолчанию, внести необходимые изменения, а затем указать эту пользовательскую форму в своих URL-адресах:

 # forms.py
from django.contrib.auth.forms import AuthenticationForm

class CustomAuthenticationForm(AuthenticationForm):
    username = UsernameField(widget=forms.TextInput(attrs={'autofocus': True}), label="Usuario")
    password = forms.CharField(
        label=_("Contraseña"),
        strip=False,
        widget=forms.PasswordInput,
    )

    error_messages = {
        'invalid_login': _(
            "- Por favor, ingrese un nombre de usuario y contraseña correctos. "
            "- Diferencie entre minúsculas y mayúsculas."
        ),
        'inactive': _("Esta cuenta no está activa."),
    }

    def __init__(self, request=None, *args, **kwargs):
        self.request = request
        self.user_cache = None
        super().__init__(*args, **kwargs)

        # Set the max length and label for the "username" field.
        self.username_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD)
        self.fields['username'].max_length = self.username_field.max_length or 254
        if self.fields['username'].label is None:
            self.fields['username'].label = capfirst(self.username_field.verbose_name)


# urls.py
from .forms import CustomAuthenticationForm

url(r'^login/$', auth_views.LoginView.as_view(template_name='registration/login.html', authentication_form= CustomAuthenticationForm), name='login'),