【问题标题】:HttpResponseRedirect changes view but does not render templateHttpResponseRedirect 更改视图但不呈现模板
【发布时间】:2013-11-30 11:17:07
【问题描述】:

我是 Django 和一般网络编程的新手,请不要让答案太复杂。我已经查看了这里的文档和问题,但我无法理解它。

我有一个表单,在验证模型并将其保存到数据库后,我想将用户重定向到新页面。我的问题是,我该如何正确地使用 HttpResponseRedirect(甚至快捷方式重定向),因为它正确地重定向了视图,url 模式被调用,但是当它到达 views.py 中的视图时,一些东西变成了数组。为什么模板没有改变,而视图却改变了?

谁能告诉我哪里错了,如何解决?

views.py

class CreateSuccess(generic.ListView):
    template_name = 'login/successReg.html'

def CreateUser(request):
    if request.method == "POST":
        form = CreateUserForm(request.POST)
        if form.is_valid():
            newUser = form.save()

            return HttpResponseRedirect('sucess/')
    else:
        form = CreateUserForm()

    return render(request, 'login/addUser.html', {'form':form})

urls.py

    urlpatterns = patterns('',
    url(r'^$', views.LoginIndex.as_view(), name='loginIndex'),
    url(r'^create/', views.CreateUser, name='addUser'),
    url(r'^authenticate/', views.LoginUser.as_view(), name='loginUser'),
    url(r'^create/success/', views.CreateSuccess.as_view(), name='successReg'),
)

【问题讨论】:

  • 会不会是因为您拼错了HttpResponseRedirect('sucess/') 而真正的意思是HttpResponseRedirect('create/success/)
  • @limelights 不,不是这样,当我使用 create/success/ 时,它会将我重定向到 create/create/success
  • @EcoGiko 尝试使用/success/ 而不是success/。注意前面的反斜杠。
  • @mariodev 我试过了,它把我带到 localhost:8000/success/ 但成功不是一个应用程序,我得到一个 404
  • @EcoGiko 对不起,我的意思是/create/success/,但我想它也会给你空白页......对吧?

标签: python django http-redirect


【解决方案1】:

尝试返回一个 reverse() 对象,该对象为您构造所需的 url

if form.is_valid():
    newUser = form.save()
    url = reverse('your_app:successReg') # Replace your_app with the name of your app
    return HttpResponseRedirect(url)

更多关于reverse():

reverse(viewname)

  • viewname 是函数名(函数引用,或者 名称的字符串版本) 这意味着您可以将 viewname 设为 views.py 中的现有函数,或者通过 urls.py 中的字符串名称引用它

始终建议以reverse('app_name : name_defined_in_urls') 的形式执行此操作

注意:由于您是初学者,我删除了那些用于将用户重定向到动态网页时使用的可选 args and kwargs 参数

【讨论】:

  • 它的工作原理谢谢,你能向我解释一下反向工作是如何工作的吗,我查看了文档但我根本无法理解。
  • @EcoGiko 只是出于好奇,你能告诉我们生成的成功网址吗? :)
  • @KDawG 感谢您对我帮助很大的总结,我在理解如何使用 args 和 kwargs 时遇到了麻烦,但现在我发现现在不需要这些。 :)
  • @EcoGiko 欢迎您,并始终记住使用反向而不是使用硬编码的 url,因为如果您想将 /success/ 更改为 /you_made_it/,您必须更改所有这些 url,但使用 reverse() 它是自动
  • @EcoGiko 很高兴你解决了这个问题,尽管下次请提供更多详细信息,更不用说 login 应用程序让每个人都感到困惑;)
猜你喜欢
  • 2017-08-14
  • 2017-06-07
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多