Django重定向与非URL参数

时间:2017-12-14 12:06:13

标签: python django

我有一个观点

class FooDetailView(View):
    def get(request, *args):
        foo_id = int(args[0])
        foo = Foo.objects.get(pk=foo_id)
        // do something and render the page

现在我想在此页面中添加一些消息。例如

class FooFuncView(View):
    def get(request):
        // do something
        return redirect('foo-detail', foo_id, 'call Func successfully')

由于我的urls.py只是

url(r'^foo-detail/([1-9][0-9]*)/', FooDetailView.as_view(),
  name='foo-detail'),

我收到错误消息,因为没有反向匹配

Reverse for 'foo-detail' with arguments '(<id>, 'call Func successfully')' not found. 1 pattern(s) tried: ['tournament-detail/contestant/([1-9][0-9]*)/']

但我不想要网址中显示的消息,因为它可能太长了。我只想简单地将页面呈现为FooDetailView,并在不同操作后添加额外的消息。有没有什么好办法实现这一目标?如果没有,对此有何解释?

2 个答案:

答案 0 :(得分:2)

当您返回重定向时,您只是告诉浏览器转到新网址,例如/foo/1/。如果不是网址的一部分,则不能包含'call Func successfully'之类的邮件。

如果您不想在网址中存储消息(或消息代码),则需要将其存储在其他位置,例如在会话中。

由于这是一个常见的要求,Django包含messages framework来执行此操作。

答案 1 :(得分:0)

在您的案例中使用已经提到的消息框架:

from django.contrib import messages

class FooFuncView(View):
    def get(request):
        // do something
        messages.add_message(request, messages.SUCCESS, 'call Func successfully')
        return redirect('foo-detail', foo_id)

该文本将在重定向中请求的页面的模板上下文中可用。

来自documentation

{% if messages %}
<ul class="messages">
    {% for message in messages %}
    <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
    {% endfor %}
</ul>
{% endif %}

如果您使用的是django-bootstrap,则只需将以下代码段添加到基本模板中即可:

{% load bootstrap3 %}

{# Display django.contrib.messages as Bootstrap alerts #}
{% bootstrap_messages %}