【问题标题】:Django set random password for user onceDjango为用户设置一次随机密码
【发布时间】:2021-11-07 13:06:12
【问题描述】:

我创建了一个扩展的用户模型和一个表单来注册它。由于表单由管理员而非用户填写,因此 UserCreationForm 有一个随机密码生成器来填写密码 1 和 2,然后设置新密码。这对新用户来说非常有用,但每次管理员编辑用户配置文件时,都会设置一个新密码。我在这里和大 G 上查看了几十个示例,但似乎找不到可用的解决方案来了解用户是否设置了密码。

我正在将此表单重新用于更新视图,这是我不希望再次生成随机密码的地方。我尝试执行与用户名相同的 if 语句检查,但它的工作方式与 auth\form.py user.set_password 正在寻找密码 1 的方式不同。

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

更新

这是 profile_edit 视图,我在其中验证现有用户的详细信息并保存通过表单所做的更改。

@login_required()
def profile_edit(request, slug, *args, **kwargs):
    """
    Used for updating the Employee profile
    """
    employee = Employee.objects.get(slug=slug)
    employee_user = User.objects.get(id=employee.user.id)
    form = EmployeeForm(request.POST or None, request.FILES or None, instance=employee)
    user_form = EmployeeRegistrationForm(request.POST or None, instance=employee_user)
    if 'cancel' in request.POST:
        return redirect('corehr:employees')

    elif request.method == 'POST':
        form = EmployeeForm(request.POST or None, request.FILES or None, instance=employee)
        user_form = EmployeeRegistrationForm(request.POST or None, instance=employee_user)
        if form.is_valid() and user_form.is_valid():
            form.save(commit=False)
            user_form.save()
            form.save()
            messages.success(request, f'{employee.get_full_name}{" was updated successfully."}')
            return redirect(reverse_lazy('corehr:profile', kwargs={'slug': slug}))
        else:
            messages.error(request, 'Please correct the errors listed below')
    else:
        form = EmployeeForm(request.POST or None, request.FILES or None, instance=employee)
        user_form = EmployeeRegistrationForm(request.POST or None, instance=employee_user)
    context = {'form': form, 'user_form': user_form}
    return render(request, 'coreHR/profile_edit.html', context)

【问题讨论】:

  • 你能区分首次用户创建和更新方法吗?
  • 这部分我还不知道,我还在学习Django。
  • 所以在创建用户时,没有用户 ID 和相关数据,当你更新时,你有一个用户和用户 ID(技术上是一个对象)。更新时,您只更改您想要更改的字段,不一定更改所有数据。
  • 是的,我理解那部分。是否可以在 User.objects.password_exists 之类的表单中进行检查?如果是,我应该在哪里插入?
  • 当你更新用户信息时,你怎么知道你在和哪个用户打交道?

标签: django django-models django-forms


【解决方案1】:

我最终接受了 Abdul 和 Ranu 的建议。两者都是正确的,所以我刚刚创建了一个 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。这太简单了,以至于我绞尽脑汁试图解决几个违背基础的复杂解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-03
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多