2011-01-26 30 views

Trả lời

4

Theo như tôi biết, không có cách nào đơn giản để thực hiện việc này bằng cách sử dụng chế độ xem chung truyền thống. Tôi đã luôn luôn cảm thấy rằng các tài liệu hướng dẫn về quan điểm chung là khá thiếu và vì vậy không bao giờ sử dụng chúng.

Về lý thuyết, bạn có thể sử dụng trình trang trí bằng cách giả định rằng chuyển hướng có nghĩa là gửi thành công.

Vì vậy, bạn có thể viết một cái gì đó như thế này (không có mã này đã được thử nghiệm):

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

Tất cả những gì đã nói và mã hoá, Django 1.3 giới thiệu class-based generic views, vì vậy nếu bạn quan tâm đến việc chuyển sang Django 1.3, bạn nên xem xét chúng. Họ có thể cho phép tùy chỉnh nhiều hơn, không chắc chắn.

Về lâu dài, tôi hiếm khi thấy biểu mẫu lợi ích sử dụng chế độ xem chung và điều này tăng gấp đôi cho những thứ như thêm/cập nhật.

+0

Cảm ơn, tôi đã quyết định không sử dụng quan điểm chung chung, vì nó không phải là đủ linh hoạt để xử lý các tình huống thực tế . – Myth

+0

Tôi chấp nhận câu trả lời này vì nó đã giúp tôi rất nhiều trong việc đưa ra quyết định của tôi (đối với những người khác: Tôi chưa thử nghiệm mã) – Myth

+0

+1. Giải pháp tốt! Bạn đang trang trí chắc chắn nên được bao gồm trong các mô-đun tin nhắn. – AJJ

35

Kể từ Django 1.6+, sử dụng bất kỳ class-based generic views, bạn có thể dựa trên successMessageMixin. Nó đơn giản như thêm mixin vào định nghĩa lớp của bạn và đặt thuộc tính success_message cho bất kỳ thứ gì bạn muốn.

Như Olivier Verdier đã đề cập, hãy nhớ display messages trong mẫu chính của bạn!

một ví dụ đơn giản từ 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" 

một ví dụ phức tạp hơn:

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) 
Các vấn đề liên quan