2011-01-26 2 views

답변

4

내가 아는 한, 일반적인 일반 뷰를 사용하여이를 수행하는 직접적인 방법은 없습니다. 난 항상 일반 뷰에 대한 문서가 꽤 부족하여 사용하지 않았다고 느꼈다.

이론적으로 리디렉션이 성공적인 제출이라는 가정하에 데코레이터를 사용할 수 있습니다. 그래서, 장고 1.3 class-based generic views 도입,

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"), 
) 

말했다 모든 코딩 :

urls.py :

그래서 당신이 뭔가를 (이 코드 중 어느 것도 테스트되지 않은) 쓸 수 Django 1.3으로 이동하는 것에 관심이 있다면, 그것들을 조사해야합니다. 더 많은 맞춤 설정을 허용 할 수 있습니다.

장기적으로 볼 때 일반보기를 사용하여 혜택 양식을 보는 경우는 거의 없으며 추가/업데이트와 같은 경우 두 배가됩니다.

+0

감사합니다, 나는 일반보기를 사용하지 않기로 결정했다 . – Myth

+0

나는 내 결정을 내리는 데 많은 도움이되었으므로이 대답을 받아들입니다. (다른 사람들은 아직 : 코드를 아직 테스트하지 않았습니다) – Myth

+0

+1. 좋은 해결책! 메시지 모듈에 데코레이터가 포함되어 있어야합니다. – AJJ

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)