2011-01-26 68 views

回答

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中引入class-based generic views,所以如果你有兴趣转向Django 1.3,你应该看看那些。他们可能会允许更多的定制,不确定。

从长远来看,我很少看到使用通用视图的好处形式,而这对于诸如添加/更新之类的东西来说是双倍的。

+0

谢谢,我已经决定不使用通用视图,因为它不够灵活地处理实际场景。 – Myth 2011-01-26 09:38:39

+0

我接受这个答案,因为它帮助我做出了很多决定(对于其他人:我还没有测试代码) – Myth 2011-01-26 09:45:44

35

Django 1.6+,使用任何class-based generic views,你可以依靠successMessageMixin。就像将mixin添加到类定义并将success_message属性设置为任何您想要的一样简单。

正如Olivier Verdier所提到的,请记住在您的主模板中输入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)