【问题标题】:Redirect to views according to form selection根据表单选择重定向到视图
【发布时间】:2010-07-12 19:42:12
【问题描述】:

我的应用程序中的用户注册是分步执行的。提交表单后,会执行一些验证,然后调用 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 中捕获它们,但这完全是一场灾难。

【问题讨论】:

  • 当您得到空白页时,您是否收到任何类型的错误?您是否尝试添加一些日志记录以查看您是否在提交表单时将其变为您期望的视图?
  • 是的,日志显示没问题。我很确定,这个错误不知何故来自“动作”。

标签: django redirect action django-views


【解决方案1】:

我不确定onClick="" hack 是否真的有效(我会让其他人对此进行权衡),但您是否尝试过仅使用普通链接,看看是那个还是其他什么?

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

(如果您真的希望它看起来像按钮,请查看&lt;button&gt;。或者只使用两个&lt;form&gt;s,每个都有一个单独的action="" 属性。)

嗯,除此之外……你说“……/user/registration/function_1_or_2_name”——{% url .. %}s 到底给了你什么?它不添加最后的 / (您在模式中需要)吗?

起初我试图添加一些 表单按钮的抽象值 (比如 'action=ok'),然后 catch 他们在 register_prompt 但这是一个 彻底的灾难。

但是你好像想操纵action属性,所以register_prompt()里什么都抓不到?

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

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))

也许是这样的?将您的按钮重命名为 okcancel,并将表单回传给自身...

【讨论】:

  • 老实说我没有尝试过普通的锚标签,现在会检查你的提议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2012-09-05
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2010-11-28
  • 2021-08-09
相关资源
最近更新 更多