我有一个UpgradeView
与django管理员一样可以保存。我可以保存,保存并继续编辑或保存并创建新对象。
每个导致不同的观点:
DetailView
,UpdateView
和CreateView
。
保存后,我想在其导致的每个视图或模板上输出消息。 例如“已成功保存”或“无法保存对象。”
编写自定义模板标签时,对我来说真的很难,因为在创建标签后,我不知道如何,何时何地将消息传递给其他视图。
这是我来自的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 %}
我如何以及在哪里将消息传递 使用会话 这些视图?
答案 0 :(得分:2)
尝试使用Django消息框架:
答案 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" %}