2011-01-26 22 views

答えて

4

私が知る限り、伝統的な一般的なビューを使用してこれを行う簡単な方法はありません。私はいつもジェネリックビューのドキュメントがかなり不足していると感じました。

理論的には、リダイレクトが送信に成功したという前提で、デコレータを使用することができます。そう、Djangoの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への移行に興味があるなら、それらを調べるべきです。彼らは、より多くのカスタマイズを可能にするかもしれません。

長期的には、一般的なビューを使用する利点はほとんどありませんが、これは追加/更新のように2倍になります。

+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) 
関連する問題