Login as any user from the Django admin interface, then switch back when done
Authored by Adam Charnock (who is available for freelance/contract work), and some great contributors.
Either checkout
django_su
from GitHub, or install usingpip
:pip install django-su
Add
django_su
to yourINSTALLED_APPS
. Make sure you put it beforedjango.contrib.admin
:INSTALLED_APPS = ( ... 'django_su', # must be before ``django.contrib.admin`` 'django.contrib.admin', )
Add
SuBackend
toAUTHENTICATION_BACKENDS
:AUTHENTICATION_BACKENDS = ( ... 'django_su.backends.SuBackend', )
Update your
urls.py
file :urlpatterns = [ url(r'^su/', include('django_su.urls')), ... ]
And that should be it!
Please see example
application. This application is used to manually test
the functionalities of this package. This also serves as a good example.
django-su
is tested on Django 2.2 or above, lower versions may work, but are considered unsupported.
The following apps are optional but will enhance the user experience:
- The 'login su' form will render using django-form-admin
- The user selection widget will render using django-ajax-selects
Note that django-ajax-selects requires the following settings:
AJAX_LOOKUP_CHANNELS = {'django_su': dict(model='auth.user', search_field='username')}
There are various optional configuration options you can set in your settings.py
# URL to redirect after the login.
# Default: "/"
SU_LOGIN_REDIRECT_URL = "/"
# URL to redirect after the logout.
# Default: "/"
SU_LOGOUT_REDIRECT_URL = "/"
# A function specifying the permissions a user requires in order
# to use the django-su functionality.
# Default: None
SU_LOGIN_CALLBACK = "example.utils.su_login_callback"
# A function to override the django.contrib.auth.login(request, user)
# view, thereby allowing one to set session data, etc.
# Default: None
SU_CUSTOM_LOGIN_ACTION = "example.utils.custom_login"
Go and view a user in the admin interface and look for a new "Login as" button in the top right.
Once you have su'ed into a user, you can get exit back into your
original user by navigating to /su/
in your browser.
This option warns the superuser when working with another user as initially logged in. To activate this option perform:
Add
django_su.context_processors.is_su
toTEMPLATE_CONTEXT_PROCESSORS
:TEMPLATE_CONTEXT_PROCESSORS = ( ... 'django_su.context_processors.is_su', )
In your
base.html
includesu/is_su.html
snippet :{% include "su/is_su.html" %}
Django-su should function normally with a custom user model. However, your ModelAdmin in your admin.py file will need tweaking as follows:
# Within your admin.py file
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from . import models
@admin.register(models.CustomUser)
class CustomUserAdmin(UserAdmin):
# The following two lines are needed:
change_form_template = "admin/auth/user/change_form.html"
change_list_template = "admin/auth/user/change_list.html"
This ensures the Django admin will use the correct template customisations for your custom user model.
This app was put together by Adam Charnock, but was largely based on ideas, code and comments at:
- http://bitkickers.blogspot.com/2010/06/add-button-to-django-admin-to-login-as.html
- http://copiousfreetime.blogspot.com/2006/12/django-su.html
django-su is packaged using seed.