Django 1.8:不显示基于类的视图中的消息

时间:2015-11-29 12:31:53

标签: python django

我正在使用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")

1 个答案:

答案 0 :(得分:0)

由于方法解析顺序问题,感谢dhke指出我正确的方向。

翻转继承顺序可以解决问题:

<强> views.py:

class RentCreateView(SuccessMessageMixin, CreateView):
    ...

顺便说一句:应该记录在adding messages in class-based views时基类的顺序很重要。