我正在寫一個簡單的網站使用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")
翻轉繼承順序,即'(SuccessMessageMixin,CreateView)'。 'SuccessMessageMixin'重寫'form_valid()',並且你使用'CreateView'得到了鑽石繼承問題。 – dhke
我注意到太遲了:這當然不是鑽石的繼承。 'CreateView'繼承'FormMixin'和'FormMixin.is_valid()'是一個死衚衕。因此,MRO問題。 – dhke