从通用视图重定向到通用视图

时间:2016-04-28 05:20:56

标签: django redirect view django-generic-views

我正在构建用户注册页面。 我希望客户一步一步地输入信息,所以我想分开表格。 例如,输入用户名,密码,然后转到下一页并输入其他信息。 我意识到会话。 这是代码snipet

class RegisterBaseView(CreateView):
    def form_valid(self, form):
        for name in form.register_fields:
            self.request.session.update(
                {
                    name: form.cleaned_data[name]
                 }
            )

        return HttpResponseRedirect(self.success_url)



class RegisterProfileView(RegisterBaseView):
    form_class = RegisterProfileForm
    success_url = reverse_lazy('')
    template_name = 'player/register_profile.html'

class RegisterUserView(RegisterBaseView):
    form_class = RegisterUserForm
    success_url = reverse_lazy('')
    template_name = 'player/register_user.html'

我希望RegisterUserView直接重定向到RegisterProfileView而不使用urls.py,因为我保存的对象最终相互链接。

我该如何撰写success_url

1 个答案:

答案 0 :(得分:3)

如果没有网址,您无法重定向到其他视图。您正在更新每个视图中的request.session。您可以使用session.get()方法从会话访问数据。如果您不在视图或表单中编写/调用save方法,则它不应保存任何内容。在链接视图的最终视图中,您可以像这样保存数据:

class FinalView(CreateView):

    def form_valid(self, form):
       name = self.request.session.get('name', None)
       ....
       if form.is_valid():
           data = form.cleaned_data['data']
           your_model = YourModel()
           your_model.name = name
           your_model.data = data
           your_model.save()

要阻止用户访问任何中间视图,请执行以下操作:

class MiddleView(SomeView):

    def form_valid(self):
        if self.request.session.get('name', None) is None:
            return HttpResponseRedirect('/first_view_url')
        else:
          ....