Privacy Policy
Snippets index

  Use django-hijack with custom User model

First, define your own User model in a "users" app; for example:

file users/models.py

import uuid
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import ugettext_lazy as _


class User(AbstractUser):
    USERNAME_FIELD = 'username'

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    ...
    ... more custom attributes here
    ...

    def __str__(self):
        text = self.get_full_name()
        if len(text) <= 0:
            text = self.username
        return text

    def is_in_group(self, groups):
        """
        Returns True when user is at least in one group;
        sample usage:

            if user.is_in_group(['administrators', 'operators', ]):
                ...
        """
        user_groups = [g.name for g in self.groups.all()]
        for group in groups:
            if group in user_groups:
                return True
        return False

requirements.txt

django-hijack==2.1.6
django-hijack-admin==2.1.6

settings.py

AUTH_USER_MODEL = 'users.User'

INSTALLED_APPS = [
    ...
    'users',
    'hijack',
    'compat',
    'hijack_admin',
    ...
]

...

#
# django-hijack settings
#

HIJACK_LOGIN_REDIRECT_URL = '/'
HIJACK_LOGOUT_REDIRECT_URL = '/users/user/'
HIJACK_DISPLAY_ADMIN_BUTTON = True
HIJACK_USE_BOOTSTRAP = True
HIJACK_REGISTER_ADMIN = False
HIJACK_ALLOW_GET_REQUESTS = True
HIJACK_URL_ALLOWED_ATTRIBUTES = ['username', ]

urls.py

from django.urls import include, path

urlpatterns += [
    ...
    #url(r'^hijack/', include('hijack.urls', namespace='hijack')),
    path('hijack/', include('hijack.urls', namespace='hijack')),
    ...
]

users/admin.py

from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
from hijack_admin.admin import HijackUserAdminMixin
from django.contrib.admin.utils import flatten_fieldsets

User = get_user_model()

@admin.register(User)
class UserAdmin(AuthUserAdmin, HijackUserAdminMixin):

    list_display = list(AuthUserAdmin.list_display)[:]
    filter_horizontal = ['groups', 'user_permissions', ]

    def get_list_display(self, request):
        list_display = super(UserAdmin, self).get_list_display(request)[:]
        if request.user.is_superuser:
            list_display += ['hijack_field', ]
        return list_display

    def get_fieldsets(self, request, obj=None):
        fieldsets = list(super().get_fieldsets(request, obj=obj))
        if obj is not None:
            editable_fieldnames = [f.name for f in self.model._meta.concrete_fields if f.editable]
            fields = flatten_fieldsets(fieldsets)
            other_fields = [f for f in editable_fieldnames if f not in fields]
            fieldsets += [
                (_('Others'), {
                    'fields': other_fields
                }),
            ]
        return fieldsets

Show "release" button in admin:

file 'templates/admin/base_site.html'

{% extends "admin/base.html" %}
{% load static hijack_tags %}

{% block extrastyle %}
    <link rel="stylesheet" type="text/css" href="{% static 'hijack/hijack-styles.css' %}" />
{% endblock %}

...

{% block nav-global %}
    {% hijack_notification %}
{% endblock %}

or in the fronted:

file 'base.html'

{% load static hijack_tags %}

<link rel="stylesheet" type="text/css" href="{% static 'hijack/hijack-styles.css' %}" />
{% hijack_notification %}