我正在使用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')
答案 0 :(得分:0)
这里的User类没有什么特别的。与其他任何模型一样,要更新现有实例,请将其作为instance
参数传递给表单。
但是,实际上您根本不需要自己这样做。您应该使用一个UpdateView,它可以为您完成此操作;那么您无需定义get
和post
。您需要在此处定义的唯一方法是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())