render_to_response 或 redirect 改变了 Django 1.8 中的模板元素
Posted
技术标签:
【中文标题】render_to_response 或 redirect 改变了 Django 1.8 中的模板元素【英文标题】:render_to_response or redirect changes the template elements in Django 1.8 【发布时间】:2015-09-14 03:09:07 【问题描述】:我正在尝试检查用户输入的电子邮件 ID 是否存在于数据库表中,如果存在 - 我想路由到“prof.html”模板,否则只在 login.html 模板中显示一条消息。
这两个条件都很好。
但是,问题是当我使用 redirect() 或 render_to_response() - 目标模板元素,如 div、input 等,正在自动更改(在这种情况下为 prof.html)?
我们也可以将上下文信息发送到目标模板吗? (在这种情况下,响应数据或数据库中的任何对象并通过视图重定向到 prof.html 模板)
下面是我的代码:
Views.py
def verifyme(request):
if request.method == "POST":
emailid4loginV = request.POST['emailid4login_Aj']
else:
emailid4loginV = ''
response_data = ''
return HttpResponse(response_data, content_type="text/plain")
response_data = ''
if Employee.objects.filter(email = emailid4loginV).exists():
response_data='Thanks for waiting - login successful'
#return render_to_response('app/prof.html', 'response_data':response_data,
# context_instance = RequestContext( request ) )
return redirect('/myprofile')
else:
response_data='Ouch! you are not a registered user!'
return HttpResponse(response_data, content_type="text/plain")
urls.py
url(r'^myprofile$', 'app.views.profile', name='profile'),
仅供参考,“个人资料”视图确实会从表中返回一些对象并在模板 app/prof.html 中呈现。
我观察到目标模板正在相同的 login.html 模板中呈现(如何?:在浏览器 url 中,我看不到 myprofile - 但用于登录的那个)但是当我通过输入网站手动请求 myprofile url (localhost:xxxxx/myprofile),它工作得很好:(
在 login.html 中提交请求之前的 URL:
在 login.html 中提交请求后的 URL - myprofile 在同一页面中呈现:
当我手动输入 url 时,模板可以完美运行。
请告诉我可能是什么问题?
编辑: 用一个小技巧解决了这个问题,贴在下面
https://***.com/questions/31091938/why-is-httpresponseredirectreverse-doesnt-redirect-to-new-page
【问题讨论】:
【参考方案1】:1) 实际上有很多方法可以将数据传递到下一个视图...通常在这种情况下,例如您有更好的方法 - 使用会话 (cookie|localstorage|sessionstorage),就像剪贴板...将会话数据保存在一个视图,稍后在另一个视图中获取。例如:
第一个视图:
self.request.session['response_data'] = 'some text'
self.request.session.set_expiry(0) # user’s session cookie will expire when the user’s Web browser is closed.
其他观点:
response_data = self.request.session.get('response_data', '')
但是如果你打算只在模板中使用这些数据,Django 有一些更高级的接口,在你的情况下语义上使用它是正确的 - 消息框架 https://docs.djangoproject.com/en/1.8/ref/contrib/messages/
2) 如果您想重定向到另一个视图,最好使用 url 命名空间和 reverse
https://docs.djangoproject.com/en/1.8/ref/urlresolvers/#reverse
return HttpResponseRedirect(reverse(app.views.profile)) # here I've passed callable object because you have not show your app url namespace, but generally use namespaces
https://docs.djangoproject.com/en/1.8/topics/http/urls/#url-namespaces
【讨论】:
谢谢你的朋友!.. 这对我来说是很好的学习。我会尽力让你知道。 它在运行时抛出错误 return HttpResponseRedirect(reverse(app.views.profile)), "NameError: app is not defined".. 应用程序名称是 app.. 我在中定义了 url 模式项目 urls.py (主要).. 我没有任何其他 urls.py 文件。有什么帮助吗? 啊,我认为应用程序是应用程序名称:D 不是项目...误解,因为项目可以包含许多应用程序...尝试简单 profile 当我使用 return HttpResponseRedirect(reverse('profile')) 时它可以工作.. 但问题仍然存在.. 我的目标模板 (prof.html) 元素正在更改.. 我没有看到浏览器 url 中的 '/myprofile' :( 你确定 Employee.objects.filter(email = emailid4loginV).exists() 是真的?以上是关于render_to_response 或 redirect 改变了 Django 1.8 中的模板元素的主要内容,如果未能解决你的问题,请参考以下文章
Django - render()、render_to_response() 和 direct_to_template() 有啥区别?
render_to_response 给出 TemplateDoesNotExist
如果 render_to_response 方法没有包含在任何地方,为啥我会收到 ImportError?