Search code examples
pythondjangodjango-generic-views

how to send success message if we use django generic views


I am new to django (1.2.4). I have created some crud with generic views. But How can I show something like "The student was added successfully" when student is created using django's messaging framework?


Solution

  • As far as I know, there isn't a straightforward way of doing this using traditional generic views. I've always felt that the documentation on generic views was pretty lacking and so never used them.

    In theory you could use a decorator by making the assumption that a redirect meant a successful submission.

    So you could write something like this (none of this code has been tested):

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

    All that said and coded, Django 1.3 introduced class-based generic views, so if you're interested in moving onto Django 1.3 you should look into those. They may allow more customization, not sure.

    In the long run I rarely see the benefit form using generic views, and this goes double for things like add/update.