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 %}