如何在Django中更改密码

如何在Django中更改密码,django,django-views,Django,Django Views,我想在不使用默认视图的情况下更改Django密码。我将PasswordChangeForm传递给视图,但我不知道如何发布它 class UpdateUserView(UpdateView): model = User template_name = 'test.html' form_class = UserUpdateForm success_url = '/' def get_context_data(self, *args, **kwargs):

我想在不使用默认视图的情况下更改Django密码。我将
PasswordChangeForm
传递给视图,但我不知道如何发布它

class UpdateUserView(UpdateView):
    model = User
    template_name = 'test.html'
    form_class = UserUpdateForm
    success_url = '/'

    def get_context_data(self, *args, **kwargs):
        data = super().get_context_data(**kwargs)
        data['PasswordChangeForm'] = PasswordChangeForm(self.request.user)
        return data

    def post(self, request, *args, **kwargs):
        change_pw = User(password=request.POST.get('id_new_password1'))
        change_pw.save()

    def get_object(self):
        return self.request.user

您可以使用以下方法更改密码:

在你看来:

...

def post(self, request, *args, **kwargs):
    user = self.request.user
    user.set_password(request.POST.get('id_new_password1'))
    user.save()
    return super().post(request, *args, **kwargs)

...
我将使用
form\u valid()
方法代替
post()
方法:

def form_valid(self,form):
    user = self.object
    user.set_password(form.cleaned_data.get("id_new_password1"))
    user.save()
    return super().form_valid(form)

您可以使用以下方法更改密码:

在你看来:

...

def post(self, request, *args, **kwargs):
    user = self.request.user
    user.set_password(request.POST.get('id_new_password1'))
    user.save()
    return super().post(request, *args, **kwargs)

...
我将使用
form\u valid()
方法代替
post()
方法:

def form_valid(self,form):
    user = self.object
    user.set_password(form.cleaned_data.get("id_new_password1"))
    user.save()
    return super().form_valid(form)

密码不能像任何其他字段一样更改,因为在保存之前需要对其进行加密。您需要使用处理加密部分的方法

您的代码将如下所示

class UpdateUserView(UpdateView):
    model = User
    template_name = 'test.html'
    form_class = UserUpdateForm
    success_url = '/'

    def get_context_data(self, *args, **kwargs):
        data = super().get_context_data(**kwargs)
        data['PasswordChangeForm'] = PasswordChangeForm(self.request.user)
        return data

    def post(self, request, *args, **kwargs):
        u = self.request.user
        u.set_password(request.POST.get('id_new_password1'))
        u.save()
        
        return super().post(request, *args, **kwargs)

    def get_object(self):
        return self.request.user

密码不能像任何其他字段一样更改,因为在保存之前需要对其进行加密。您需要使用处理加密部分的方法

您的代码将如下所示

class UpdateUserView(UpdateView):
    model = User
    template_name = 'test.html'
    form_class = UserUpdateForm
    success_url = '/'

    def get_context_data(self, *args, **kwargs):
        data = super().get_context_data(**kwargs)
        data['PasswordChangeForm'] = PasswordChangeForm(self.request.user)
        return data

    def post(self, request, *args, **kwargs):
        u = self.request.user
        u.set_password(request.POST.get('id_new_password1'))
        u.save()
        
        return super().post(request, *args, **kwargs)

    def get_object(self):
        return self.request.user

这和我的答案不一样?是的,似乎我们提交的时间几乎完全相同。view users.views.UpdateUserView没有返回HttpResponse对象。它没有返回任何结果。我就是这么想的got@daraq,您的post方法必须返回此
return super().post(请求,*args,**kwargs)
。看看我的答案。我会试试看,顺便说一句,django change password表单有两个字段(id_new_password1和id_new_password2用于确认),我应该得到这两个字段?这和我的答案不一样?是的,看起来我们提交的时间几乎完全相同。view users.views.UpdateUserView没有返回HttpResponse对象。它没有返回任何结果。我就是这么想的got@daraq,您的post方法必须返回此
return super().post(请求,*args,**kwargs)
。请看我的答案。我会尝试一下,顺便说一下,django change password表单有两个字段(id_new_password1和id_new_password2用于确认),我应该获得这两个字段吗?