2011-01-26 30 views

Respuesta

4

Hasta donde yo sé, no hay una manera directa de hacerlo utilizando vistas genéricas tradicionales. Siempre sentí que faltaba documentación sobre visores genéricos y, por lo tanto, nunca los utilicé.

En teoría, podría usar un decorador suponiendo que una redirección significaba una presentación exitosa.

Por lo que podría escribir algo como esto (ninguna de este código ha sido probado):

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

Todo lo que dijo y codificada, Django 1.3 introdujo class-based generic views, por lo Si estás interesado en mudarte a Django 1.3, deberías investigarlos. Pueden permitir una mayor personalización, no estoy seguro.

A la larga, rara vez veo el formulario de beneficios con vistas genéricas, y esto se duplica para cosas como agregar/actualizar.

+0

Gracias, me han decidido no utilizar la vista genérica, ya que no es lo suficientemente flexible como para manejar situaciones prácticas . – Myth

+0

Estoy aceptando esta respuesta, ya que me ayudó mucho a tomar una decisión (para otros: aún no he probado el código) – Myth

+0

+1. Buena solución! Tu decorador seguramente debe incluirse en el módulo de mensajes. – AJJ

35

A partir de Django 1.6 +, utilizando cualquier class-based generic views, se puede confiar en la successMessageMixin. Es tan simple como agregar el mixin a su definición de clase y establecer el atributo success_message a lo que desee.

Como mencionó Olivier Verdier, por favor recuerde display messages en su plantilla principal!

un ejemplo sencillo de la 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" 

un ejemplo más complejo:

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) 
Cuestiones relacionadas