根据表单选择重定向到视图

时间:2010-07-12 19:42:13

标签: django redirect action django-views

我的应用程序中的用户注册是按步骤执行的。提交表单后,执行一些验证,然后调用register_prompt视图。它呈现一个表单,有两个选项 - 'ok'和'cancel'。单击“确定”将运行注册,单击“取消”将重定向到主页面。问题是,无论我选择哪一个,我都被重定向到带有空白页面的... / user / registration / function_1_or_2_name(虽然我在HttpResponseRedirect中指定了url)。我怎样才能使它发挥作用?

def register_prompt(request):
    context = RequestContext(request)
    return render_to_response('user/data_operations/alert.html', context_instance=context)

在alert.html上加载的表单:

<form action="" method="post">
    <input type="submit" class="submit" name="submit" onClick="this.form.action='{% url register_new %}'" value="Ok" />
    <input type="submit" class="submit" name="submit" onClick="this.form.action='{% url redirect_home %}'" value="Cancel" />
</form>

重定向视图(可能还有更好的方法吗?):

def redirect_home(request):
    return HttpResponseRedirect('/')

def register_new(request):
    (... registration magic here ...)
    return HttpResponseRedirect('/user/registration/complete/')

最后是url conf:

   url(r'^register_new/$', register_new, name="register_new"),
   url(r'^redirect_home/$', redirect_home, name="redirect_home"),
   url(r'^register_prompt/$', register_prompt, name="register_prompt"),

起初我试图在表单的按钮中添加一些抽象值(比如'action = ok'),然后在register_prompt中捕获它们,但这完全是灾难。

1 个答案:

答案 0 :(得分:0)

我不确定onClick="" hack是否真的有效(我会让别人对此进行评估),但你是否尝试使用普通链接,看看是否是那个或其他什么?

<a href="{% url register_new %}">OK</a>
<a href="{% url register_home %}">Cancel</a>

(如果您确实希望它看起来像按钮,请查看<button>。或者只使用两个<form>,每个action=""都有一个单独的{% url .. %}属性。)

哼声,除此之外......你说“... / user / registration / function_1_or_2_name” - register_prompt()给你带来了什么?它是否不添加最终/(您在模式中需要)?

  

起初我试图添加一些   形成按钮的抽象值   (比如'action = ok'),然后赶上   他们在register_prompt但它是一个   完全灾难。

但你似乎想要操纵动作属性,所以你不能抓住def register_prompt(req): if 'ok' in req.POST: return register_new(req) if 'cancel' in req.POST: return register_cancel(req) return render_to_response('user/data_operations/alert.html', context_instance=RequestContext(req)) 中的任何东西?

总而言之,我建议您使用普通链接,或者在呈现它的视图中实际处理POST:

ok

也许是这样的?将您的按钮重命名为cancel和{{1}},并将表单发回给自己......