Django视图函数仅用于以http重定向结束的逻辑

时间:2012-09-14 08:12:26

标签: django http

那里,

我刚刚阅读here发布的数据无法通过重定向发送,

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


我的情况

我有一个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结尾到另一个页面,注册完全由注册(请求)处理。

1 个答案:

答案 0 :(得分:2)

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

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

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

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