Как отправить сообщение об успехе, если мы используем общие представления django

Я новичок в django (1.2.4). Я создал несколько crud с общими представлениями. Но как я могу показать что-то вроде "Студент был добавлен успешно", когда ученик создан с использованием платформы обмена сообщениями django?

Ответ 1

Насколько я знаю, нет простого способа сделать это, используя традиционные общие представления. Я всегда чувствовал, что документация по общим представлениям довольно не хватает и поэтому никогда их не использовала.

В теории вы можете использовать декоратор, сделав предположение, что перенаправление означает успешное подачу.

Итак, вы можете написать что-то вроде этого (ни один из этих кодов не был протестирован):

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 внесло общие представления на основе классов, поэтому, если вам интересно перейти на Django 1.3, вы должны Посмотрите на них. Они могут разрешить большую настройку, не уверен.

В конечном итоге я редко вижу форму льгот, используя общие представления, и это удваивается для таких вещей, как добавление/обновление.

Ответ 2

Как и в Django 1.6 +, используя любой общие представления на основе классов, вы можете положиться на successMessageMixin. Это так же просто, как добавление mixin к вашему определению класса и установка атрибута success_message в соответствии с тем, что вы хотите.

Как сказал Оливье Вердье, не забудьте отображать сообщения в своем основном шаблоне!

простой пример из 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)