【问题标题】:Class based view extending UpdateView not saving form correctly基于类的视图扩展 UpdateView 未正确保存表单
【发布时间】:2011-08-19 11:30:39
【问题描述】:

我试图在 Django 1.3 中使用 UpdateView 保存表单,但似乎遇到了问题。当我保存表单时,它会 POST 到当前 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。有没有人遇到过这个问题?

【问题讨论】:

    标签: python django views django-views django-1.3


    【解决方案1】:

    想出了解决办法。出现问题是因为表单中存在未报告的错误。这似乎发生在需要以某种方式设置才能使表单有效的隐藏字段。

    解决方案非常简单。您只需要覆盖 post 函数并考虑任何隐藏字段:

    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))
    

    【讨论】:

      猜你喜欢
      • 2022-07-02
      • 2022-11-20
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-25
      • 2014-02-01
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多