0

嘿那里,

我刚刚读到这里发布的数据不能通过重定向发送,

然后发现人们通常不喜欢使用重定向。我的问题是为什么?


我的情况

我有一个 Django 应用程序,它首先呈现一个页面,该页面提供了使用注册或匿名使用的选择。

def start(request):
    request.session.flush()
    return render_to_response('start.html')

如果选择注册使用,则会呈现一个简单的表单以插入注册数据,它会循环到自身,直到表单有效,然后发生“auth/”。

def registration(request):
if request.method == "POST":
    form = RegistrationForm(request.POST)
    if form.is_valid():
        return HttpResponseRedirect('auth/')
    else:
        return render_to_response('registration.html',
                                 {'form':form})
form = RegistrationForm()
return render_to_response('registration.html',
                         {'form':form})

如果选择匿名使用,则跳过注册页面,并重定向到 'auth/',与上面代码中相同的 Django 视图函数:

return HttpResponseRedirect('auth/')

我希望通过 auth 实现的目的是设置会话,将数据写入数据库,然后重定向与注册用户和匿名用户相同的下一页(只有会话会有所不同)。

def auth(request):
    ipdb.set_trace()
    if request.method == "POST":
        request.session['user_type'] = 'REG'
        request.session['email'] = request.POST['email']
        request.session['first_name'] = request.POST['first_name']
        RegisteredUser.objects.create(first_name = request.POST['first_name'],
                                      email = request.POST['email'],
                                      company = request.POST['company'])
    else:
        request.session['user_type'] = 'ANONIM'
    return HttpResponseRedirect('next_page')

当然,当调试器启动时,request.method 总是返回 GET。


我的理由

有很多关于将视图与逻辑分开的讨论,当我有一个 Django 视图函数时,我发现它的可读性或松散耦合(如果我放弃'auth/','next_page' 将不得不采取它的功能)必须

  • 检查 request.post

    • 如果它的原因是当前页面的表单验证,或者它来自上一页,在这种情况下将该数据写入基础
  • 进行额外检查以设置注册用户或匿名用户的会话

我必须这样做,因为仅将单独的函数用于重定向而不是渲染的逻辑似乎不是普遍接受的方式。

有人可以解释一下吗?

更新解决方案

感谢答案,我想出了如何做到这一点的模式。现在注册码是:

def registration(request):
    if request.method == "POST":
        form = RegistrationForm(request.POST)
        if form.is_valid():
            request.session['user_type'] = 'REG'
            request.session['email'] = request.POST['email']
            request.session['first_name'] = request.POST['first_name']
            RegisteredUser.objects.create(first_name = request.POST['first_name'],
                                          email = request.POST['email'],
                                          company = request.POST['company'])

            return HttpResponseRedirect('param_select/')
        else:
            return render_to_response('registration.html',
                                     {'form':form},
                                     context_instance = RequestContext(request))
    form = RegistrationForm()
    return render_to_response('registration.html',
                             {'form':form},
                             context_instance = RequestContext(request))

从现在开始,我将使用“使用 POST 数据循环进入自己,然后执行逻辑”方法。

为了使名称神秘化,这就是新注册(请求)的作用。

首先它呈现表单以输入数据

由于链接到自身,一旦提交数据就会被召回

form action="" method="post"

重复此操作,直到未提交正确的表单数据,然后调用逻辑(在这种情况下,写入基础并设置会话)。

它以 httpRedirect 到另一个页面结束,使注册完全由注册(请求)处理。

4

1 回答 1

2
  • 默认情况下,您可以假设用户是匿名的并request.session['user_type'] = 'ANONIM'在您的start()视图中设置。

  • 无论您在做什么,auth()您都可以registration()request.session['user_type'] = 'REG'. 有了这个,如果需要,您也可以使用经过验证的表单来创建RegisteredUser和标记错误。

  • 一旦POST处理有效并完成,它就可以重定向到您的next_page.

  • 如果选择匿名用户,start将重定向到next_page而不是auth/

于 2012-09-14T08:26:37.180 回答