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

时间:2015-07-01 12:33:32

标签: django-templates django-views django-sessions django-1.8 templatetags

我有一个UpgradeView与django管理员一样可以保存。我可以保存保存并继续编辑保存并创建新对象

每个导致不同的观点:

DetailViewUpdateViewCreateView

保存后,我想在其导致的每个视图或模板上输出消息。 例如“已成功保存”“无法保存对象。”

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

这是我来自的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'里面我只有字符串说“成功保存”,这确实没有任何结果,我忘记了为什么我这样做了。

这是在我的模板中(没有):

{% load msg_handler %}
{% get_msg %}

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

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

我做得比我想象的更快。 这是我的自定义模板标记:

@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!'
        ...

我的模板中没有任何变化。

如果有更优雅/有用的方式,我会很感激。

编辑:

感谢LorenzoPeñ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" %}