【问题标题】:How to update django auth User using a custom form如何使用自定义表单更新 django auth 用户
【发布时间】:2018-12-14 09:00:02
【问题描述】:

我正在使用 Django 的内置身份验证来管理社交媒体网站上的用户。我正在使用一对一的关系将配置文件附加到每个用户。我可以使用 UpdateView 更新我附加的配置文件的所有部分。但是我不知道如何使用 Django 的内置用户来做到这一点。所以我创建了一个使用 _meta 类的表单。我已经到了我的表单将添加一个新用户而不是更新当前用户的地步。我希望你们中的一个可以帮助我修复我的代码。提前感谢您提供的任何帮助

views.py

class PrivProfileUpdate(View):
    form_class = UserUpdateForm
    template_name = 'user/user_form.html'

    #display a blank form
    def get(self, request, pk):
        form = self.form_class(None)
        return render(request, self.template_name, {'form': form})

    #proces form data
    def post(self, request, pk):
        form = self.form_class(request.POST)
        user = User.objects.get(pk=pk)
        if form.is_valid():

            user = form.save(commit=True)

            print("we are trying to save")
            #cleaned (normalized) data
            username = form.cleaned_data['username']
            password = form.cleaned_data['password']
            first_name = form.cleaned_data['first_name']
            last_name = form.cleaned_data['last_name']
            email = form.cleaned_data['email']
            user.set_password(password) #this is the only way to change a password because of hashing
            user.save()

        return render(request, self.template_name,{'form': form})

forms.py

class UserUpdateForm(forms.ModelForm):
    password = forms.CharField(widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ['username', 'email', 'password', 'first_name', 'last_name']

解决方案:

在views.py中

class PrivProfileUpdate(UpdateView):
    model = User
    form_class = UserUpdateForm
    template_name = 'user/user_form.html'

    def form_valid(self, form):
        user = form.save(commit=True)
        password = form.cleaned_data['password']
        user.set_password(password)
        user.save()
        return redirect('user:index')

【问题讨论】:

    标签: django python-3.x django-models django-forms django-views


    【解决方案1】:

    这里的 User 类没有什么特别之处。与任何其他模型一样,要更新现有实例,请将其作为 instance 参数传递给表单。

    但是,您实际上根本不需要自己执行此操作。您应该使用 UpdateView,它会为您执行此操作;那么您不需要定义getpost。您需要在这里定义的唯一方法是form_valid,用于设置密码:

    class PrivProfileUpdate(UpdateView):
        form_class = UserUpdateForm
        template_name = 'user/user_form.html'
    
        def form_valid(self, form):
            user = form.save(commit=True)
            password = form.cleaned_data['password']
            user.set_password(password)
            user.save()
            return HttpResponseRedirect(self.get_success_url())
    

    【讨论】:

    • 谢谢,我必须更改一些东西才能使其正常工作。对于那些遇到这个问题的人,我有上面的修复。还要感谢丹尼尔,我没有足够的代表给你点数。
    猜你喜欢
    • 2020-07-05
    • 1970-01-01
    • 2019-01-12
    • 2021-05-07
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多