33from django .contrib .auth .models import User
44from django .core .exceptions import ValidationError
55
6- # Константы — SonarCloud их не трогает
7- USERNAME_FIELD = 'username'
8- PASSWORD1_FIELD = 'password1'
9- PASSWORD2_FIELD = 'password2'
10-
116
127class UserRegistrationForm (UserCreationForm ):
138 first_name = forms .CharField (
149 required = True ,
1510 label = 'Имя' ,
16- widget = forms .TextInput (attrs = {'class' : 'form-control' }),
17- error_messages = {'required' : 'Обязательное поле.' }
11+ widget = forms .TextInput (attrs = {
12+ 'class' : 'form-control' ,
13+ }),
14+ error_messages = {
15+ 'required' : 'Обязательное поле.' ,
16+ }
1817 )
1918 last_name = forms .CharField (
2019 required = True ,
2120 label = 'Фамилия' ,
22- widget = forms .TextInput (attrs = {'class' : 'form-control' }),
23- error_messages = {'required' : 'Обязательное поле.' }
21+ widget = forms .TextInput (attrs = {
22+ 'class' : 'form-control' ,
23+ }),
24+ error_messages = {
25+ 'required' : 'Обязательное поле.' ,
26+ }
2427 )
2528
2629 class Meta :
2730 model = User
28- fields = ("first_name" , "last_name" , USERNAME_FIELD , PASSWORD1_FIELD , PASSWORD2_FIELD )
31+ fields = (
32+ "first_name" , "last_name" , "username" , "password1" , "password2"
33+ )
2934 labels = {
30- USERNAME_FIELD : 'Имя пользователя' ,
31- PASSWORD1_FIELD : 'Пароль' ,
32- PASSWORD2_FIELD : 'Подтверждение пароля' ,
35+ 'username' : 'Имя пользователя' ,
36+ 'password1' : 'Пароль' ,
37+ 'password2' : 'Подтверждение пароля' ,
3338 }
3439 help_texts = {
35- USERNAME_FIELD : 'Обязательное поле. Не более 150 символов. Только буквы, цифры и @/./+/-/_' ,
36- PASSWORD1_FIELD : 'Ваш пароль должен содержать как минимум 3 символа.' ,
37- PASSWORD2_FIELD : 'Для подтверждения введите пароль ещё раз.' ,
40+ 'username' : (
41+ 'Обязательное поле. Не более 150 символов. '
42+ 'Только буквы, цифры и символы @/./+/-/_.'
43+ ),
44+ 'password1' : 'Ваш пароль должен содержать как минимум 3 символа.' ,
45+ 'password2' : 'Для подтверждения введите, пожалуйста, '
46+ 'пароль ещё раз.' ,
3847 }
3948 error_messages = {
40- USERNAME_FIELD : {
49+ 'username' : {
4150 'required' : 'Обязательное поле.' ,
4251 'unique' : 'Пользователь с таким именем уже существует.' ,
4352 'max_length' : 'Не более 150 символов.' ,
4453 },
45- PASSWORD1_FIELD : {'required' : 'Обязательное поле.' },
46- PASSWORD2_FIELD : {'required' : 'Обязательное поле.' },
54+ 'password1' : {
55+ 'required' : 'Обязательное поле.' ,
56+ },
57+ 'password2' : {
58+ 'required' : 'Обязательное поле.' ,
59+ },
60+ }
61+ widgets = {
62+ 'username' : forms .TextInput (attrs = {
63+ 'class' : 'form-control' ,
64+ }),
65+ 'password1' : forms .PasswordInput (attrs = {
66+ 'placeholder' : 'Пароль' ,
67+ 'class' : 'form-control' ,
68+ 'autocomplete' : 'new-password' ,
69+ }),
70+ 'password2' : forms .PasswordInput (attrs = {
71+ 'class' : 'form-control' ,
72+ 'autocomplete' : 'new-password' ,
73+ }),
4774 }
48- # УБРАЛИ widgets отсюда — они больше не нужны
49- # widgets = { ... } ← удалить весь блок!
5075
5176 def __init__ (self , * args , ** kwargs ):
77+ # 1. Сначала вызываем родительский конструктор
5278 super ().__init__ (* args , ** kwargs )
5379
54- # Теперь безопасно обращаемся по константам
55- self .fields [USERNAME_FIELD ].help_text = (
80+ # 2. Затем переопределяем help_text для нужных полей
81+ self .fields ['username' ].help_text = (
5682 'Обязательное поле. Не более 150 символов. '
5783 'Только буквы, цифры и символы @/./+/-/_.'
5884 )
59- self .fields [PASSWORD1_FIELD ].widget .attrs .update ({
60- 'placeholder' : 'Пароль' ,
61- 'class' : 'form-control' ,
62- 'autocomplete' : 'new-password' ,
63- })
64- self .fields [PASSWORD2_FIELD ].widget .attrs .update ({
65- 'class' : 'form-control' ,
66- 'autocomplete' : 'new-password' ,
67- })
85+ self .fields ['password1' ].help_text = (
86+ 'Ваш пароль должен содержать как минимум 3 символа.'
87+ )
88+ self .fields ['password2' ].help_text = (
89+ 'Для подтверждения введите, пожалуйста, пароль ещё раз.'
90+ )
6891
6992 def clean_password2 (self ):
70- p1 = self .cleaned_data .get (PASSWORD1_FIELD )
71- p2 = self .cleaned_data .get (PASSWORD2_FIELD )
72- if p1 and p2 and p1 != p2 :
93+ password1 = self .cleaned_data .get ("password1" )
94+ password2 = self .cleaned_data .get ("password2" )
95+ if password1 and password2 and password1 != password2 :
7396 raise ValidationError ("Два поля пароля не совпадают." )
74- return p2
97+ return password2
7598
7699 def save (self , commit = True ):
77100 user = super ().save (commit = False )
@@ -83,23 +106,24 @@ def save(self, commit=True):
83106
84107
85108class UserUpdateForm (forms .ModelForm ):
109+ # Добавляем поля пароля (необязательные)
86110 password1 = forms .CharField (
87111 label = 'Пароль' ,
88- widget = forms .PasswordInput (attrs = {
89- 'placeholder' : 'Пароль' ,
90- 'autocomplete' : 'new-password'
91- }) ,
92- required = False ,
112+ widget = forms .PasswordInput (
113+ attrs = { 'placeholder' : 'Пароль' , 'autocomplete' : 'new-password' }
114+ ),
115+ required = True ,
116+ error_messages = { 'required' : 'Обязательное поле' } ,
93117 help_text = 'Оставьте пустым, если не хотите менять пароль.' ,
94118 )
95119 password2 = forms .CharField (
96120 label = 'Подтверждение пароля' ,
97- widget = forms .PasswordInput (attrs = {
98- 'class' : 'form-control' ,
99- 'autocomplete' : 'new-password'
100- }) ,
101- required = False ,
102- help_text = 'Введите пароль ещё раз ' ,
121+ widget = forms .PasswordInput (
122+ attrs = { 'class' : 'form-control' , 'autocomplete' : 'new-password' }
123+ ),
124+ required = True ,
125+ error_messages = { 'required' : 'Обязательное поле' } ,
126+ help_text = 'Подтверждение пароля ' ,
103127 )
104128
105129 class Meta :
@@ -119,17 +143,21 @@ class Meta:
119143 }
120144
121145 def clean (self ):
122- cleaned = super ().clean ()
123- p1 = cleaned .get ('password1' )
124- p2 = cleaned .get ('password2' )
125- if p1 and p1 != p2 :
146+ cleaned_data = super ().clean ()
147+ password1 = cleaned_data .get ('password1' )
148+ password2 = cleaned_data .get ('password2' )
149+ if password1 != password2 :
126150 raise ValidationError ('Пароли не совпадают' )
127- return cleaned
151+ return cleaned_data
128152
129153 def save (self , commit = True ):
130154 user = super ().save (commit = False )
131- if self .cleaned_data ['password1' ]:
132- user .set_password (self .cleaned_data ['password1' ])
155+
156+ # Обновляем пароль, только если он указан
157+ password1 = self .cleaned_data .get ('password1' )
158+ if password1 :
159+ user .set_password (password1 )
160+
133161 if commit :
134162 user .save ()
135163 return user
0 commit comments