[Django] Admin Oberfläche für "User" ändern

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Hallo Forum,

ich würde gerne den django.contrib.auth.models.User um einige Felder erweitern. Im allgemeinen wird davon abgeraten das Model selbst zu bearbeiten, sondern stattdessen ein weiteres Model anzulegen und dann zwischen beiden einen OneToOne Beziehung zu erstellen. Das ist verständlich und auch kein Problem.

Code: Alles auswählen

from django.db import models
from django.contrib.auth.models import User

class extendedUser(models.Model):
    user = models.OneToOneField(User)
    something = models.BooleanField()
Ich könnte jetzt entsprechend dafür ein Formular im Admin-Bereich anlegen, aber schöner würde ich es finden, wenn die entsprechenden Felder einfach unter den bisherigen bei dem User-Model angezeigt werden würden, und auch bei Änderungen mit gespeichert würden.

Könnt ihr mir da auf die Sprünge helfen? Gerade bei dem User-Admin-Interface scheint eine Menge Magie im Spiel zu sein.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sparrow hat geschrieben:Ich könnte jetzt entsprechend dafür ein Formular im Admin-Bereich anlegen, aber schöner würde ich es finden, wenn die entsprechenden Felder einfach unter den bisherigen bei dem User-Model angezeigt werden würden, und auch bei Änderungen mit gespeichert würden.
Ich habe bei mir in der passenden admin.py dafür folgenden Code:

Code: Alles auswählen

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

from bdh.models import UserProfile

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False

# Define a new User admin
class UserAdmin(UserAdmin):
    inlines = (UserProfileInline, )

# Re-register UserAdmin
admin.site.unregister(User)
admin.site.register(User, UserAdmin)
UserProfile ist dabei das, was bei dir extendedUser heißt (und laut PEP-8 ExtendedUser heißen sollte).
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Super, danke dir!

Da ich das möglicherweise aus verschiedenen Apps den Benutzer erweitern möchte, habe ich mir eine entsprechende Funktion geschrieben:

Code: Alles auswählen

def add_inline_to_user(inline_admin):
    """ Adding inline-admin to the UserAdminForm"""
    user_model = User
    user_admin = admin.site._registry.get(user_model, None)
    if user_admin:
        admin.site.unregister(user_model)
        user_admin.inlines.append(inline_admin)
        admin.site.register(user_model)
Antworten