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

Redirect from Generic View to Generic View

我正在构建一个用户注册页面。 我想让客户一步步输入信息,所以我想把表格分开。 例如输入用户名、密码,然后进入下一页输入其他信息。 我通过会话意识到这一点。 这是代码 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

如果没有 url,您将无法重定向到另一个视图。您正在更新每个视图中的 request.session。您可以使用 session.get() 方法从会话访问数据。如果您没有 write/call 视图或表单中的保存方法,那么它不应该保存任何内容。在链接视图的最终视图中,您可以像这样保存数据:

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:
          ....