2015-04-01 75 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) 
    ...