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. Это было настолько просто, что я ломал голову, пытаясь обойти несколько сложных решений, которые шли вразрез с основами.

Вернуться на верх