如何在Django通用视图中发送成功消息
我刚接触Django(1.2.4)。我用通用视图创建了一些增删改查的功能。但是,当学生创建成功后,我该如何显示类似“学生添加成功”的消息呢?我想用Django的消息框架来实现这个功能。
4 个回答
2
你问的这个功能其实在Django的通用视图里已经实现了:
https://github.com/django/django/blob/1.2.X/django/views/generic/create_update.py#L115
你可以在你的主模板中通过显示消息来看到这些信息。
46
从Django 1.6+开始,使用任何基于类的通用视图时,你可以使用successMessageMixin。这很简单,只需要把这个mixins加到你的类定义里,然后设置success_message
属性为你想要的内容。
正如Olivier Verdier提到的,请记得在你的主模板中显示消息!
这是来自文档的一个简单示例:
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from myapp.models import Author
class AuthorCreate(SuccessMessageMixin, CreateView):
model = Author
success_url = '/success/'
success_message = "%(name)s was created successfully"
这是一个更复杂的示例:
from django.contrib.messages.views import SuccessMessageMixin
from django.views.generic.edit import CreateView
from myapp.models import ComplicatedModel
class ComplicatedCreate(SuccessMessageMixin, CreateView):
model = ComplicatedModel
success_url = '/success/'
success_message = "%(calculated_field)s was created successfully"
def get_success_message(self, cleaned_data):
# cleaned_data is the cleaned data from the form which is used for string formatting
return self.success_message % dict(cleaned_data,
calculated_field=self.object.calculated_field)
4
据我所知,使用传统的通用视图来实现这个功能并没有简单的方法。我一直觉得关于通用视图的文档写得不够好,所以我从来没有使用过它们。
理论上,你可以使用一个装饰器,假设重定向意味着提交成功。
所以你可以写一些这样的代码(这些代码都没有经过测试):
urls.py:
try:
from functools import wraps
except ImportError:
from django.utils.functional import wraps
from django.http import HttpRedirectResponse
from django.contrib import messages
from django.views.generic import *
def add_message(success_message=None):
def decorator(func):
def inner(request, *args, **kwargs):
resp = func(request, *args, **kwargs)
if isinstance(resp, HttpRedirectResponse):
messages.success(request, message)
return resp
return wraps(func)(inner)
return decorator
student_info_edit = {
'template_name': 'myapp/student/form.html',
'template_object_name': 'student',
'form_class': studentForm,
}
student_info_new = {
'template_name': 'myapp/student/form.html',
'form_class': studentForm,
'post_save_redirect': '/myapp/students/',
}
urlpatterns += patterns('',
url(r'^students/$', list_detail.object_list, { 'queryset': Student.objects.all() }, name="students"),
url(r'^students/(?P<object_id>\d+)/$', add_message("Student record updated successfully")(create_update.update_object), student_info_edit, name="student_detail"),
url(r'^students/new$', add_message("The student was added successfully.")(create_update.create_object), student_info_new, name="student_new"),
)
说到这里,Django 1.3 引入了基于类的通用视图,所以如果你有兴趣升级到 Django 1.3,你应该看看这些。它们可能允许更多的自定义,但我不太确定。
从长远来看,我很少看到使用通用视图的好处,尤其是在添加或更新这样的操作上,更是如此。