-1

I want to execute a javascript at the time of login and logout. I tried to use user_logged_in.connect(myfunction) singal that executes at the time of login. I returned HttpResponse in myfunction but thats not working.

Other option is is_authenticated() but that just check if user is logged in ,does not check if login session is just starting.

Is there any way to render data to template using user.logged_in() signal or any other way through i can achieve this ?

Ajeet Lakhani
  • 3,768
  • 2
  • 22
  • 37

1 Answers1

2

For a login action, you can make use of a generic FormView, and add the message in success_message bring to you by the SuccessMessageMixin, in views.py file:

from django.contrib.auth import login
from django.contrib.auth.forms import AuthenticationForm
from django.contrib import messages
from django.contrib.messages.views import SuccessMessageMixin
from django.core.urlresolvers import reverse_lazy
from django.views.generic import FormView


class LoginView(SuccessMessageMixin, FormView):
    form_class = AuthenticationForm
    template_name = 'login.html'
    success_url = reverse_lazy('home') # url's name to redirect
    success_message = 'Welcome back %(username)s!' # A welcome message

    def form_valid(self, form):
        user = form.get_user()
        login(self.request, user)

        return super(LoginView, self).form_valid(form)

And for the logout is enough with a function view, and the django messages framework:

from django.contrib.auth.views import logout
from django.http import HttpResponseRedirect


def logout_view(request):
    logout(request)
    messages.success(request, u"You have logout successfully!") # custom message for success logout
    return HttpResponseRedirect('/')

Add the urls to your urls.py file:

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

from .views import LoginView, logout_view

urlpatterns = patterns('',
    url(r'^$', TemplateView.as_view(template_name='index.html'), name='home'),
    url(r'^login/$', LoginView.as_view(), name='login'),
    url(r'^logout/$', logout_view, name='logout'),
)

When the action occurs the messages object is available in the template, so just use a loop to show the messages, index.html:

<body>

{% if user.is_authenticated %}
  <a href="{% url 'logout' %}">log out</a>
{% else %}
  <a href="{% url 'login' %}">login</a>
{% endif %}

Some content
{% if messages %}
  {% for message in messages %}
    <div id='message-alert' class='alert alert-success'>
      {{ message }}
    </div>
  {% endfor %}
{% endif %}
more content
</body>

You also need to render the login form in login.html:

{% if user.is_authenticated %}
  <p>You are authenticated as <span class="text-success">{{ user.username }}</span></p>
  <a href="{% url 'logout' %}">Log out</a>
{% else %}
  <form method="post">
    {{ form.as_p }}
    {% csrf_token %}
    <button class="btn">Login</button>
  </form>
{% endif %}

Note: the css classes come from bootstrap, if it's the case GOOD, else just use your own.

slackmart
  • 4,754
  • 3
  • 25
  • 39
  • I am using `@login_required` decorator for some of my views and in that case the requested page becomes `next` and in case of a successful login django redirects to that page. I wanted to show a message in the redirected page, preferably some message with autohide, is it possible with your solution? – Ibo Oct 29 '17 at 10:00