使用会话的 Django 自定义模板标签
Django custom template tag using session
我有一个 UpgradeView
可以像在 django admin 中一样进行保存。我可以保存、保存并继续编辑或保存并创建新对象。
每一个都导致不同的观点:
DetailView
、UpdateView
和 CreateView
.
保存后,我想在其指向的每个视图或模板上发出 消息 。
例如 "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 消息框架:
我有一个 UpgradeView
可以像在 django admin 中一样进行保存。我可以保存、保存并继续编辑或保存并创建新对象。
每一个都导致不同的观点:
DetailView
、UpdateView
和 CreateView
.
保存后,我想在其指向的每个视图或模板上发出 消息 。 例如 "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 消息框架: