如果使用Django通用视图,如何发送成功消息

2024-03-29 12:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文


Tags: python
3条回答

从Django 1.6+开始,使用任何class-based generic views,都可以依赖successMessageMixin。只需将mixin添加到类定义并将success_message属性设置为所需的任何内容。

正如奥利维尔德提到的,请记住在主模板中display messages

来自docs的一个简单示例:

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)

您所要求的功能已经在Django通用视图中实现:

https://github.com/django/django/blob/1.2.X/django/views/generic/create_update.py#L115

您将在主模板中通过displaying messages看到这些消息。

据我所知,没有一种简单的方法可以使用传统的泛型视图来实现这一点。我一直觉得关于泛型视图的文档非常缺乏,因此从未使用过它们。

理论上,可以通过假设重定向意味着成功提交来使用decorator。

所以你可以写这样的东西(这些代码都没有经过测试):

url.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引入了class-based generic views,因此如果您对进入django1.3感兴趣,您应该研究一下这些。他们可能允许更多的定制,不确定。

从长远来看,我很少看到使用泛型视图的优点表单,而对于像add/update这样的东西,这一点就加倍了。

相关问题 更多 >