如何使用自定义表单更新django auth用户

时间:2018-07-05 19:39:06

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

我正在使用Django的内置身份验证来管理社交媒体网站上的用户。我正在使用一对一关系将个人资料附加到每个用户。我可以使用UpdateView更新附加的配置文件的所有部分。但是我不知道如何使用Django的内置User来做到这一点。因此,我创建了一个使用_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')

1 个答案:

答案 0 :(得分:0)

这里的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())