在Django模板中显示查询字符串值
我想把一些成功的信息从获取方法打印到首页(home.html),也就是模板页面,想通过查询字符串来实现。我已经用下面的代码重定向到了首页:
return HttpResponseRedirect("/mysite/q="+successfailure)
现在我想在首页的文件(或者模板文件/home.html)中打印出“成功”的字符串,还有其他内容。
我搜索了解决方案,发现需要在设置中添加“django.core.context_processors.request context”。但是我找不到该添加的位置。我现在使用的是Python 2.7和Django 1.4.3。
我还尝试使用了:
render_to_response("home.html",{'q':successfailure})
然而,结果却是在当前页面(addContent.html,这不是我想要的),我希望把结果发送到'/mysite/'这个网址,并在那里打印出来。
请给我一些合适的建议。提前谢谢!
3 个回答
在Django模板中,使用session来重定向会更简单,方法是用request.session["key"],下面的代码示例展示了这一点:
# "views.py"
from django.shortcuts import redirect
def my_view(request):
# Here
request.session["messages"] = {"success": "Success", "fail": "Fail"}
return redirect('/mysite')
# "home.html"
{{ request.session.messages.success }} {# Success #}
{{ request.session.messages.fail }} {# Fail #}
另外,在Django模板中,你还可以通过几种类型的消息来进行重定向,下面的代码示例展示了如何做:
# "views.py"
from django.contrib import messages # Here
from django.shortcuts import redirect
def my_view(request):
messages.debug(request, 'This is debug')
messages.info(request, 'This is info')
messages.success(request, 'This is success')
messages.warning(request, 'This is warning')
messages.error(request, 'This is error')
return redirect("/mysite")
# "home.html"
{% load i18n static %}<!DOCTYPE html>
{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
<head>
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}">
</head>
{% load i18n %}
<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}"
data-admin-utc-offset="{% now "Z" %}">
{% if messages %}
<ul class="messagelist">{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message|capfirst }}</li>
{% endfor %}</ul>
{% endif %}
</body>
</html>
不过,我不明白为什么即使在"settings.py"中设置了"DEBUG = True",只有"debug"消息没有显示出来:
我不太确定我理解这个问题,但你可以通过 request.GET
在你的视图中访问查询字符串。
所以你可以调整渲染 home.html 的视图,把 successfailure 这个变量加入到上下文中。大概是这样的 -
def home_view(request):
#....
successfailure = request.GET
return render(request, 'home.html', {'succsessfailure': successfailure.iteritems()})
然后在你的模板中遍历这些变量。
{% for key, value in successfailure %}
<p>{{ key }} {{ value }}</p>
{% endfor %}
如果查询字符串中有特定的键,你可以用 request.GET['your_key']
来获取它的值,这样就不需要调用 iteritems()
了(也不需要在模板中进行遍历)。
这些是默认的上下文处理器:
https://docs.djangoproject.com/en/dev/ref/templates/api/#using-requestcontextTEMPLATES = [ {"OPTIONS": { "context_processors": [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
]}}]
如果你的设置里没有这个,那说明你还没有覆盖它。现在就去做吧。
然后在你的模板里,可以这样写:
{% if request.GET.q %}<div>{{ request.GET.q }}</div>{% endif %}
另外,我注意到你链接的 URL 中没有使用查询字符串操作符 ?
。你应该加上:
return HttpResponseRedirect("/mysite/?q="+successfailure)