Django устанавливает случайный пароль для пользователя один раз
Я создал расширенную модель User и форму для его регистрации. Поскольку форму заполняет администратор, а не пользователь, в UserCreationForm есть генератор случайных паролей, который заполняет password1 и 2, а затем устанавливает новый пароль. Это отлично подходит для нового пользователя, но каждый раз, когда администратор редактирует профиль пользователя, он будет устанавливать новый пароль. Я просмотрел несколько десятков примеров здесь и на большом G, но не могу найти подходящего решения, чтобы узнать, установлен ли у пользователя пароль.
Я повторно использую эту форму для update view, где я не хочу, чтобы случайный пароль был сгенерирован снова. Я попытался сделать ту же проверку оператора if в качестве имени пользователя, но это не работает так же, как auth\form.py user.set_password ищет password1.
class EmployeeRegistrationForm(UserCreationForm):
email = forms.EmailField(required=True, widget=forms.EmailInput(attrs={'class': 'form-control mb-2',
'placeholder': 'Email address'}))
first_name = forms.CharField(widget=forms.TextInput(attrs={'class': 'form-control mb-2',
'placeholder': 'First name'}))
last_name = forms.CharField(
widget=forms.TextInput(attrs={'class': 'form-control mb-2', 'placeholder': 'Last name'}))
password1 = None
password2 = None
class Meta:
model = User
fields = ['email', 'first_name', 'last_name']
def clean(self):
password = User.objects.make_random_password(length=10,
allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')
self.cleaned_data['password1'] = password
self.cleaned_data['password2'] = password
return super().clean()
def save(self, commit=True):
user = super().save(commit=False)
user.email = self.cleaned_data['email']
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
if user.username == '':
if len(user.first_name.split()) and len(user.last_name.split()) > 1:
username = f'{"".join(user.first_name.split()[:2])}{"."}{"".join(user.last_name.split())}'
elif len(user.first_name.split()) > 1:
username = f'{"".join(user.first_name.split()[:2])}{"."}{user.last_name}'
elif len(user.last_name.split()) > 1:
username = f'{user.first_name}{"."}{"".join(user.last_name.split())}'
else:
username = f'{user.first_name}{"."}{user.last_name}'
username = username.lower()
user.username = username
user.set_password(self.cleaned_data['password1'])
if commit:
user.save()
return user
В итоге я воспользовался предложениями Абдула и Рану. Они оба правы, поэтому я просто создал UserUpdateForm для обновления данных, а не для "повторного создания" пользователя. Все работает так же гладко, как и раньше.
class UserUpdateForm(forms.ModelForm):
class Meta:
model = User
fields = ['email', 'first_name', 'last_name']
widgets = {
'email': forms.EmailInput(attrs={'class': 'form-control mb-2'}),
'first_name': forms.TextInput(
attrs={'class': 'form-control mb-2'}),
'last_name': forms.TextInput(
attrs={'class': 'form-control mb-2'}),
}
Я заменил ссылку в представлении profile_edit с EmployeeRegistrationForm на UserUpdateForm. Это было настолько просто, что я ломал голову, пытаясь обойти несколько сложных решений, которые шли вразрез с основами.