使用会话的 Django 自定义模板标签

Django custom template tag using session

我有一个 UpgradeView 可以像在 django admin 中一样进行保存。我可以保存保存并继续编辑保存并创建新对象

每一个都导致不同的观点:

DetailViewUpdateViewCreateView.

保存后,我想在其指向的每个视图或模板上发出 消息 。 例如 "Successfully saved""Object could not be saved."

编写自定义模板标签对我来说真的很难,因为创建标签后,我不知道如何、在何处以及何时将消息传递给其他视图。

这是我来自的UpdateView

class TopicEditView(UpdateView):
    fields = ['title','description',]
    model = Topic
    ...
    def get_success_url(self):
        if   self.request.POST.get('save'):
            return reverse('topic_detail', kwargs={'pk':self.object.pk})
        elif self.request.POST.get('save_and_continue'):
            return reverse('topic_edit', kwargs={'pk':self.object.pk})
        elif self.request.POST.get('save_and_create_new'):
            return reverse('topic_create')
        else:
            return reverse('fallback_success_url')

我的自定义模板标签仍然是空的,因为我看到的唯一例子对我来说很难理解。

@register.inclusion_tag('msg.html', takes_context=True)
def get_msg(context):
    return None

'msg.html' 里面我只有 "Successfully saved" 这样的字符串,这没有任何结果,我忘记了我为什么这样做。

这是我的模板(没有):

{% load msg_handler %}
{% get_msg %}

我如何以及在哪里可以使用会话将消息消息传递给这些视图?

我完成这件事的速度比我想象的要快。 这是我的自定义模板标签:

@register.simple_tag(takes_context=True)
def get_msg(context):
    try:
        return context.request.session.pop('msg')
    except KeyError:
        return ''

这是我的看法,传递信息:

class TopicEditView(UpdateView):
    ...
    def get_success_url(self):
        self.request.session['msg']='Successfully saved!'
        ...

我的模板没有任何变化。

如果有更elegant/useful的方法,不胜感激

编辑:

感谢 Lorenzo Peña 的评论,我尝试使用消息框架,它真的很容易使用!

首先我再次进入我的 views.py 并导入 messages

from django.contrib import messages

并更改了这一行

self.request.session['msg']='Successfully saved!'

为此:

messages.add_message(self.request, messages.SUCCESS, 'Successfully saved!')

然后我制作了一个名为 msg_loader.html 的新模板,其中包含:

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

并在我的其他模板中更改了这个

{% load msg_handler %}
{% get_msg %}

至此

{% include "msg_loader.html" %}

尝试使用 Django 消息框架:

http://docs.djangoproject.com/en/1.8/ref/contrib/messages