Почему моя перезапись на ярлыках и виджетах из UserCreationForm на Django не работает? - PullRequest
0 голосов
/ 19 сентября 2019

Хотя я нашел способ обойти эту проблему (см. Внизу страницы), я не понимаю, почему моя перегрузка UserCreationForm не работает без удаления родительских атрибутов.Тем не менее, я провел много исследований. В частности, в этом документе

forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django.utils.translation import gettext, gettext_lazy as _

from . import models

class SignUpForm(UserCreationForm):

    """ Form for sign up in training app """

    email_confirmation = forms.EmailField()
    # password1 = forms.CharField(label='Mot de passe')

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

        super(SignUpForm, self).__init__(*args, **kwargs)

        print(self._meta.labels)
        print(self._meta.fields)


        # self._meta.labels = {
        #         'username': 'Nom d`\'utilisateur',
        #         'password1': 'Mot de passe',
        #         'password2': 'Confirmation du mot de passe',
        #         'email': 'Adresse e-mail',
        #         'email_confirmation': 'Confirmation de l\'adresse e-mail',
        #     }

    class Meta(UserCreationForm.Meta):

        model = User

        fields = (

            "username",
            "password1",
            "password2",
            "email",
            "email_confirmation",

        )

        labels = {
            'username': _('Nom d\'utilisateur'),
            'password1': _('Mot de passe'),
            'password2': _('Confirmation du mot de passe'),
            'email': _('Adresse e-mail'),
            'email_confirmation': _('Confirmation de l\'adresse e-mail'),
        }

        # UserCreationForm.Meta.labels = {
        #     'username': _('Nom d\'utilisateur'),
        #     'password1': _('Mot de passe'),
        #     'password2': _('Confirmation du mot de passe'),
        #     'email': _('Adresse e-mail'),
        #     'email_confirmation': _('Confirmation de l\'adresse e-mail'),
        # }

        widgets = {
            'username': forms.TextInput(attrs={'class': 'form-control'}),
            'password1': forms.PasswordInput(attrs={'class': 'form-control'}),
            'password2': forms.PasswordInput(attrs={'class': 'form-control'}),
            'email': forms.EmailInput(attrs={'class': 'form-control'}),
            'email_confirmation': forms.EmailInput(attrs={'class': 'form-control'}),
        }

        error_messages = {

            'email_confirmation': {

                'email_mismatch': _("Les deux e-mails saisis ne sont pas identiques."),

            },

            'password2': {

                'password_mismatch': _("Les deux mots de passes saisis ne sont pas identiques."),

            },

        }

    def save(self, commit=True):

        if not commit:

            raise NotImplementedError("Can't create User and UserProfile without database save")

        user = super(SignUpForm, self).save(commit=False)
        user.email = self.cleaned_data['email']
        user.save()

        user_profil = models.Profil(user=user, mark=0).save()

        return user, user_profil

    def clean(self):

        cleaned_data = super(SignUpForm, self).clean()
        email = cleaned_data.get("email")
        email_confirmation = cleaned_data.get("email_confirmation")

        if email and email_confirmation and email != email_confirmation:

            raise forms.ValidationError('email_mismatch')



Когда я запускаю страницу, я получаю:

Веб-страница

Мы видим, что не все метки назначены, как в мета-тегах в forms.py .То же самое для атрибутов виджетов.Хотя функции печати отображают все правильные метки:

>>> print(self._meta.labels)
{'username': "Nom d'utilisateur", 'password1': 'Mot de passe', 'password2': 'Confirmation du mot de passe', 'email': 'Adresse e-mail', 'email_confirmation': "Confirmation de l'adresse e-mail"}

Мое решение, которое я нашел, как обойти проблему, заключается в функции init:

self.fields.get('password1').label = _('Mot de passe')

Это правильное решение?

РЕДАКТИРОВАТЬ: Я думаю, что это сообщение и эта часть документа , возможно, ответы на мой допрос.

...