2015-11-29 64 views
3

我正在寫一個簡單的網站使用Django 1.8.6(Python 3.5.0)的出租服務。在用戶創建租金後(使用基於類CreateView),用戶被重定向到租賃的索引頁面,其中應顯示「成功」消息(索引模板從base.html繼承)。Django 1.8:基於類的視圖中的消息不顯示

我閱讀了Django的文檔messages framework以及adding messages in class-based views的相關章節。

我在我的代碼中添加了相關部分,但是在創建租金後,消息不顯示。 <div id="messages">(來自base.html)以HTML格式呈現,但不顯示任何消息(因爲success_message未在RentCreateView中處理)。

我的設置:

settings.py(根據文檔沒有產生額外設置必要的Django 1.8):

... 
INSTALLED_APPS = (
    ... 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'rental_service', 
) 
... 
MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    ... 
) 
... 
TEMPLATES = [ 
    { 
     ... 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

base.html文件(在消息迭代):

... 
<div id="messages"> 
    {% if messages %} 
    <ul class="messages"> 
     {% for message in messages %} 
     <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
     {% endfor %} 
    </ul> 
    {% endif %} 
</div> 
... 

rent_list.html(extends base.html):

{% extends "base.html" %} 
... 

views.py(使用由SuccessMessageMixin提供success_message屬性):

class RentCreateView(CreateView, SuccessMessageMixin): 
    model = Rent 
    fields = [ 
     "timestamp_rent", 
     "timestamp_return", 
     "customer", 
     "rental_examples" 
    ] 
    template_name_suffix = "_create_form" 
    success_message = "Rent created successfully." # Ignored: even if "def get_success_message(self, cleaned_data): raise Exception()" 

    def form_valid(self, form): 
     form.instance.user = self.request.user 
     return super(RentCreateView, self).form_valid(form) 

    def get_success_url(self): 
     return reverse("rental_service:rent_index") 
+5

翻轉繼承順序,即'(SuccessMessageMixin,CreateView)'。 'SuccessMessageMixin'重寫'form_valid()',並且你使用'CreateView'得到了鑽石繼承問題。 – dhke

+2

我注意到太遲了:這當然不是鑽石的繼承。 'CreateView'繼承'FormMixin'和'FormMixin.is_valid()'是一個死衚衕。因此,MRO問題。 – dhke

回答

0

dhke感謝指點我在正確的方向,因爲該方法的解析順序的問題。

周圍的繼承順序翻轉解決了這個問題:

views.py:

class RentCreateView(SuccessMessageMixin, CreateView): 
    ... 

BTW:應當記載,基類的順序是顯著時adding messages in class-based views

+0

對於任何可能覆蓋基類功能的Mixin而言,順序實際上非常重要。將基類放在第一個然後是Mixins看起來很自然,因爲mixins「僅」*添加*功能(它對我來說)。當然,這通常是錯誤的。 – dhke