【问题标题】:Django custom template tag using session使用会话的 Django 自定义模板标签
【发布时间】:2015-09-18 14:50:39
【问题描述】:

我有一个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 %}

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

【问题讨论】:

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


【解决方案1】:

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

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

我的模板没有任何变化。

如果有更优雅/有用的方法,我将不胜感激。

编辑:

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

【讨论】:

    【解决方案2】:

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 2015-01-20
      • 2012-03-15
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2011-03-31
      • 2011-10-05
      相关资源
      最近更新 更多