Tôi mới sử dụng django (1.2.4). Tôi đã tạo ra một số crud với quan điểm chung chung. Nhưng làm thế nào tôi có thể hiển thị một cái gì đó như "Học sinh đã được thêm thành công" khi sinh viên được tạo ra bằng cách sử dụng khung tin nhắn của django?cách gửi tin nhắn thành công nếu chúng tôi sử dụng chế độ xem chung django
Trả lời
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.
Các chức năng mà bạn đang yêu cầu đã được thực hiện trong quan điểm Django generic:
https://github.com/django/django/blob/1.2.X/django/views/generic/create_update.py#L115
Bạn sẽ thấy các thông điệp bằng displaying messages trong mẫu chính của bạn.
Bạn muốn cập nhật các URL trong câu trả lời này, các liên kết đã chết – DeA
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ả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
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
+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