2015-04-01 90 views
2

我想使用Django的消息框架。Django消息不工作

https://docs.djangoproject.com/en/dev/ref/contrib/messages/#enabling-messages

我通过messages.success(self.request, 'Updated.')添加消息,但是没有消息显示告诉我究竟做了。 {% if messages %}评估始终为false。

如果我打印{{ messages }}我得到<django.contrib.messages.storage.fallback.FallbackStorage object at 0x7fb701c47b70>

什么可能是错的?

我中间件

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

我的模板context处理器

TEMPLATE_CONTEXT_PROCESSORS = [ 
    "django.contrib.auth.context_processors.auth", 
    "django.template.context_processors.debug", 
    "django.template.context_processors.i18n", 
    "django.core.context_processors.request", 
    "django.template.context_processors.media", 
    "django.template.context_processors.static", 
    "django.template.context_processors.tz", 
    "django.contrib.messages.context_processors.messages" 
] 

我安装的应用程序

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'django.contrib.humanize', 
) 

编辑

class ItemUpdateView(LoginRequiredMixin, UpdateView): 
    model = Item 
    context_object_name = 'item' 
    form_class = ItemForm 

    def get_form_kwargs(self): 
     kwargs = super(ItemUpdateView, self).get_form_kwargs() 
     kwargs["user"] = self.request.user 
     return kwargs 

    def form_valid(self, form): 
     with transaction.atomic(), reversion.create_revision(): 
      self.object = form.save() 
      reversion.set_user(self.request.user) 
      reversion.set_comment("Updating") 
     messages.success(self.request, "Updated") 
     return HttpResponseRedirect(self.get_success_url()) 

    def get_success_url(self): 
     return self.object.get_update_url() 

编辑2

{% if messages %} 
    <ul class="messages"> 
     {% for message in messages %} 
      <li{% if message.tags %} class="{{ message.tags }}"{% endif %}> 
       {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}Important: {% endif %} 
       {{ message }} 
      </li> 
     {% endfor %} 
    </ul> 
{% else %} 
    no messages 
{% endif %} 

编辑3

这对我来说是一个很大的谜。

如果我使用

def form_valid(self, form): 
    self.object = form.save() 
    messages.success(self.request, "Updated") 
    return HttpResponseRedirect(self.get_success_url()) 

它不添加消息,但它如果我使用

def dispatch(self, request, *args, **kwargs): 
    messages.success(request, 'Updated.') 
    return super(ItemUpdateView, self).dispatch(request, *args, **kwargs) 
+0

你能后,你添加邮件的实际片段? – Selcuk 2015-04-01 13:15:59

+0

我已经更新了我的问题与片段 – Jamgreen 2015-04-01 13:18:43

+0

一切似乎与您的配置好,我会检查,而不是如果messages.success实际上被调用。另一件可能发生的事情是,您成功后多次重定向,所以消息在两者之间丢失。 – gseva 2015-04-01 14:21:24

回答

-1

你没有看到你的邮件模板,因为form_valid返回添加消息HttpResponse,它将请求对象放在地板上。

请注意您的解决方案确实向前传递请求对象。

return super(ItemUpdateView, self).dispatch(request, *args, **kwargs) 

你可以做的来解决这个问题是要确保你总是在视图中获得消息,并把它作为一个上下文对象。然后,响应方法将无关紧要。

from django.contrib import messages 

class Homepage(View): 
    template_name = 'index.html' 
    def get(request): 
     return render(request, self.template_name, { 
      'messages': messages.get_messages(request) 
     }) 

    def post(request): 
     return HttpResponseRedirect('/home/') 
+0

这是不正确的。可以使用'form_valid'中的'messages.success'。 – Udi 2017-02-21 06:58:10

+0

@Udi你在说什么?这既不是问题,也不是我正在处理的问题。当然,他可以在form_valid中使用messages.success!如果消息没有以某种方式绑定到请求对象,消息将永远不会显示。 – Ivan 2017-02-21 15:57:52

+0

可以从form_valid返回重定向。 – Udi 2017-02-21 16:00:18

0

发布此信息以帮助未来的用户。

要解决此问题,必须在form_valid功能添加到超()的调用:

def form_valid(self, form): 
    super().form_valid(form) # if Python 3, else super(ItemUpdateView, self).form_valid(form) 
    ...