Хотя я нашел способ обойти эту проблему (см. Внизу страницы), я не понимаю, почему моя перегрузка 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')
Это правильное решение?
РЕДАКТИРОВАТЬ: Я думаю, что это сообщение и эта часть документа , возможно, ответы на мой допрос.