基于类的视图扩展UpdateView未正确保存表单
我在用Django 1.3的UpdateView来保存一个表单时遇到了一些问题。当我保存表单时,它会把数据发送到当前的URL,而成功后的跳转URL也是这个URL。
在保存表单时,页面上的所有字段都更新了,看起来数据是改变了,但当我刷新页面时,所有的内容又恢复到了原来的样子。
这个表单是一个模型表单,这是我的视图代码:
class UserProfileView(UpdateView):
context_object_name = 'profile'
def get_template_names(self):
return ['webapp/user_profile.html']
def get_queryset(self):
pk = self.kwargs.get('pk', None)
if pk is not None:
user = User.objects.get(pk=pk)
else:
raise AttributeError(u"Could not locate user with pk %s"
% pk)
if user.contributor_profile.all():
queryset = Contributor.objects.filter(user__pk=pk)
else:
queryset = Member.objects.filter(user__pk=pk)
return queryset
def get_object(self, queryset=None):
if queryset is None:
queryset = self.get_queryset()
return queryset.get()
我不知道哪里出了问题,因为Django是通过UpdateView类和它扩展的Mixin来保存表单的。有没有人遇到过类似的问题?
1 个回答
9
我找到了问题的解决办法。问题出现是因为表单里有一个错误没有被报告出来。这种情况通常发生在一些隐藏字段上,这些字段需要以某种方式设置,才能让表单有效。
解决方法很简单。你只需要重写一下提交功能,并考虑到所有的隐藏字段:
def post(self, request, *args, **kwargs):
pk = self.kwargs.get('pk', None)
if pk is not None:
user = User.objects.get(pk=pk)
else:
raise AttributeError(u"Could not locate user with pk %s"
% pk)
if user.contributor_profile.all():
contributor = Contributor.objects.get(user=user)
form = ContributorForm(request.POST, instance=contributor)
else:
member = Member.objects.get(user=user)
form = MemberForm(request.POST, instance=member)
if form.is_valid():
self.object = form.save()
return HttpResponseRedirect(self.get_success_url())
else:
return self.render_to_response(self.get_context_data(form=form))