我有一个观点
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
,并在不同操作后添加额外的消息。有没有什么好办法实现这一目标?如果没有,对此有何解释?
答案 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)
该文本将在重定向中请求的页面的模板上下文中可用。
{% 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 %}