我正在使用Django 1.8.6(Python 3.5.0)编写一个简单的网站,用于租赁服务。用户创建租金后(使用基于类的CreateView
),用户被重定向到租用的索引页面,其中应显示“成功”消息(索引模板继承自base.html
)。
我阅读了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(扩展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")
答案 0 :(得分:0)
由于方法解析顺序问题,感谢dhke指出我正确的方向。
翻转继承顺序可以解决问题:
<强> views.py:强>
class RentCreateView(SuccessMessageMixin, CreateView):
...
顺便说一句:应该记录在adding messages in class-based views时基类的顺序很重要。