89 votes

Utilisation de Django auth UserAdmin pour un modèle d'utilisateur personnalisé

De la Docs Django.Contrib.Auth :

Extension de l'utilisateur par défaut de Django Si le modèle User de Django vous convient parfaitement et que vous souhaitez simplement ajouter des informations de profil supplémentaires, vous pouvez simplement sous-classer django.contrib.auth.models.AbstractUser et ajoutez vos champs de profil personnalisés. Cette classe fournit l'implémentation complète de l'utilisateur par défaut en tant que modèle abstrait.

C'est dit et fait. J'ai créé un nouveau modèle comme ci-dessous :

class MyUser(AbstractUser):
  some_extra_data = models.CharField(max_length=100, blank=True)

Cela s'affiche dans l'administration presque comme le standard de Django User . Cependant, la différence la plus importante dans l'administration est que le champ de (re)définition du mot de passe n'est pas présent, mais un CharField normal est affiché à la place. Dois-je vraiment remplacer des éléments de la configuration d'administration pour que cela fonctionne ? Si c'est le cas, comment puis-je le faire d'une manière un peu DRY (c'est-à-dire sans copier des choses depuis les sources de Django... eww...) ?

2voto

Rasmus Points 35

Si vous souhaitez vous connecter aux sections par défaut au lieu de copier et coller le code du noyau de Django, vous pouvez étendre la section UserAdmin et injecter vos champs dans la classe fieldsets comme souhaité.

Dans Django v4.0.x, l'option fieldsets Le tuple que vous modifiez ressemble à ceci :

    fieldsets = (
        (None, {"fields": ("username", "password")}),
        (_("Personal info"), {"fields": ("first_name", "last_name", "email")}),
        (
            _("Permissions"),
            {
                "fields": (
                    "is_active",
                    "is_staff",
                    "is_superuser",
                    "groups",
                    "user_permissions",
                ),
            },
        ),
        (_("Important dates"), {"fields": ("last_login", "date_joined")}),
    )

Source : https://github.com/django/django/blob/stable/4.0.x/django/contrib/auth/admin.py#L47-L63

Maintenant, par exemple, pour ajouter un role champ :

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from .models import User

class UserAdmin(BaseUserAdmin):
    fieldsets = BaseUserAdmin.fieldsets
    fieldsets[0][1]['fields'] = fieldsets[0][1]['fields'] + (
        'role',
    )

admin.site.register(User, UserAdmin)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X