在Django模板中显示查询字符串值

18 投票
3 回答
21338 浏览
提问于 2025-04-17 16:11

我想把一些成功的信息从获取方法打印到首页(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 个回答

0

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"消息没有显示出来:

在这里输入图片描述

1

我不太确定我理解这个问题,但你可以通过 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() 了(也不需要在模板中进行遍历)。

38

这些是默认的上下文处理器:

https://docs.djangoproject.com/en/dev/ref/templates/api/#using-requestcontext
TEMPLATES = [ {"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)

撰写回答