12

I, want show a successful message when a row is saved, using Django's messaging framework with Class Based Views, with code shown below, but don't show the message.

Any help would be very much appreciated

#views.py

from django.views.generic import ListView, CreateView, UpdateView, TemplateView
from django.contrib.messages.views import SuccessMessageMixin

class CreateEmployee(SuccessMessageMixin, CreateView):
    model = Employee
    template_name = 'employees/create.html'
    form_class = frmCreate

    def get_success_url(self):
       return reverse('Employees:Create')

    def get_context_data(self, **kwargs):
        contexto = super(CreateEmployee, self).get_context_data(**kwargs)
        contexto['action'] = reverse('Employees:Create')
        return contexto

    success_message = 'Employee successful created'



#template
#create.html

<form action="{{ action }}" method="POST" role="form">
    {% csrf_token %}

    {{ form.as_p }}

    <input type="submit" value="Save" class="btn btn-success">
<form>

{% if messages %}
    <div class="col-lg-3 color03">
        <ul class="messages">
            {% for message in messages %}
                <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
            {% endfor %}
        </ul>
    </div>
{% endif %}
JasonMArcher
  • 14,195
  • 22
  • 56
  • 52
  • 4
    Have You try change order of arguments from class CreateEmployee(CreateView, SuccessMessageMixin) to class CreateEmployee(SuccessMessageMixin, CreateView) like in example from django docs: https://docs.djangoproject.com/en/dev/ref/contrib/messages/#adding-messages-in-class-based-views ? – szymanskilukasz Jul 23 '14 at 15:39
  • @szymanskilukasz I' done the suggested change, this solve my problem, f..ck I, am so blind – Elio Clímaco Herrera Jul 23 '14 at 15:58
  • 1
    @ElioClímacoHerrera I guess your form is throwing error and not saving. Have you checked on that ? Also the Mixin should be in order of as stated on the docs. – sagarchalise Jul 23 '14 at 16:11
  • yes @sagarchalise my form is saving data, thanks for your help. I, solved changing order of arguments – Elio Clímaco Herrera Jul 23 '14 at 16:32
  • Possibly this is a duplicate of [this](https://stackoverflow.com/questions/39999956/django-how-to-send-a-success-message-using-a-updateview-cbv)! – Abishek Jan 24 '20 at 21:09

6 Answers6

11

Just use self.request like this:

from django.contrib import messages
messages.add_message(self.request, messages.INFO, 'Hello world.')
Alexey
  • 1,366
  • 1
  • 13
  • 33
  • 1
    I couldn't make it work with the accepted answer, I'm using Django 1.11 and this one just worked. `def form_valid(self, form)` – elsadek Dec 02 '17 at 10:42
5

Using Django 2.2, and per the documentation here here is what worked for myself on a CLASS based view:

settings.py

INSTALLED_APPS = [
    'django.contrib.messages',
]

MIDDLEWARE = [
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
]

TEMPLATES = [
    {
        'BACKEND': #,
        'DIRS': #,
        'APP_DIRS': #,
        'OPTIONS': {
            'context_processors': [
                'django.contrib.messages.context_processors.messages',
          ],
     },
]

"The default storage backend relies on sessions. That’s why SessionMiddleware must be enabled and appear before MessageMiddleware in MIDDLEWARE."

views.py

from django.contrib.messages.views import SuccessMessageMixin

class SignUpView(SuccessMessageMixin, CreateView):
    form_class = CustomUserCreationForm
    success_url = reverse_lazy('users:login')
    template_name = 'users/register.html'
    success_message = "%(username)s was created successfully"

urls.py

path(_('register/'), views.SignUpView.as_view(), name='register'),

And in the template: (using bootstrap classes)

 {% if messages %}
     {% for message in messages %}
         <div class="text-center alert alert-{{ message.tags }}">
             {{ message|safe }}
         </div>
     {% endfor %}
 {% endif %}
CyberDemic
  • 180
  • 2
  • 6
4
#Using django 3.2

#In views.py  

from django.contrib import messages
from .models import CreateEmployer
from django.views.generic import CreateView

class SignUpView(CreateView):
    model = CreateEmployer
    template_name = ‘employee/register_employee.html’
    fields = '__all__'

    # this method will enable your message to display
    # you can also use it to overwrite form data.
    def form_valid(self, form):
        messages.success(self.request, f”Account created successfully”)
        return super().form_valid(form)


#in your urls.py
from .views import SingUpView
from django.urls import path


urlpatterns = [
    path(‘register/‘, SignUpView.as_view(), name=“user-register"),
]


#in your template

 {% if messages %}
   {% for message in messages %}
     <div class="alert alert-{{message.tags}}">
       {{message}}
     </div>
   {% endfor %}
{% endif %}


#I hope this helps anyone facing same problem in the future.
Abayomi Olowu
  • 199
  • 1
  • 10
1

Django==3.2.8

views.py

Your CreateEmployee class inside views.py file you need to add this :-

def form_valid(self):
        messages.success(self.request, f"Account created successfully")
        return HttpResponseRedirect(self.get_success_url()

And base.html In top base.html you need to add this :-

<div class="container">
    {% if messages %}
            {% for message in messages %}
              <div class="alert alert-{{ message.tags }}">
                {{ message|safe }}
              </div>
            {% endfor %}
          {% endif %}
    {% block content %}{% endblock content %}
  </div>

Inside base.html class use bootstrap class.

BiswajitPaloi
  • 586
  • 4
  • 16
0

you have to set the message storage in settings.py

MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage'

Greetings

mbieren
  • 1,034
  • 8
  • 31
  • by default as on today, once you create a project, all messages packages would have been loaded into the project settings, so you don't necessarily need to set message storage in settings but it works with that too, Thanks. – Abayomi Olowu Jul 04 '21 at 17:10
0

You can also define MESSAGE_TAGS in your 'settings.py' for later use.

# settings.py
from django.contrib import messages

# Django messages
MESSAGE_TAGS = {
    messages.DEBUG: 'alert-secondary',
    messages.INFO: 'alert-info',
    messages.SUCCESS: 'alert-success',
    messages.WARNING: 'alert-warning',
    messages.ERROR: 'alert-danger',
}

# views.py
from django.views.generic import ListView, CreateView, UpdateView, TemplateView
from django.contrib.messages.views import SuccessMessageMixin

class CreateEmployee(SuccessMessageMixin, CreateView):
    model = Employee
    template_name = 'employees/create.html'
    form_class = frmCreate
    success_message = 'Employee successful created'

    def get_success_url(self):
       return reverse('Employees:Create')


    def get_context_data(self, **kwargs):
        contexto = super(CreateEmployee, self).get_context_data(**kwargs)
        contexto['action'] = reverse('Employees:Create')
        return contexto


# and use in your template 'employees/create.html'
{% if messages %}
    {% for message in messages %}
        <div class="alert {{ message.tags }} alert-dismissible fade show" role="alert"
            {{ message|striptags|safe }}
            <button type="button" class="btn btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
        </div>
    {% endfor %}
{% endif %}
monwisn
  • 36
  • 3