Wie kann ich inline bearbeitet ein django Benutzerprofil im Admin-Interface?
-
25-09-2019 - |
Frage
Wenn Sie zusätzliche Informationen zu speichern, zu einem Benutzer (django.contrib.auth.models.User) in Django Sie die raffinierte AUTH_PROFILE_MODULE zu Plug in einem „Profil“ Modell verwenden können. Jeder Benutzer erhält dann ein Profil. Es ist alles hier beschrieben:
- http: //docs.djangoproject .com / de / dev / Themen / auth / # Speicherung-Zusatzinformations-zu-Benutzer
- http://www.djangobook.com/en/1.0/chapter12/# cn222
Nun lassen Sie uns sagen, dass ich eine Anwendung erstellt haben, mit einem Modell namens Konten namens Userprofile und registriert sie als Profilmodell für meine Nutzer. Wie Inline ich die Bearbeitung des Profils in dem Admin-Interface für die Bearbeitung von Benutzern (oder umgekehrt)?
Lösung 3
Nun, es stellt sich heraus, dass dies ganz einfach, wenn Sie wissen, wie es zu tun. Das ist mein myapp / accounts / admin.py:
from django.contrib import admin
from myapp.accounts.models import UserProfile
from django.contrib.auth.models import User
class UserProfileInline(admin.StackedInline):
model = UserProfile
max_num = 1
can_delete = False
class AccountsUserAdmin(admin.UserAdmin):
inlines = [UserProfileInline]
# unregister old user admin
admin.site.unregister(User)
# register new user admin that includes a UserProfile
admin.site.register(User, AccountsUserAdmin)
Der Standard admin.UserAdmin
Modeladmin-Klasse für Benutzer ist nicht registriert und ein neues Geschäft einen Inline-UserProfile
spezifiziert wird an seiner Stelle registriert. Ich dachte, ich sollte teilen.
Andere Tipps
schlage ich eine leicht verbesserte Version von André-Lösung, wie sie die Listenansicht in / admin / Auth / user bricht /:
from django.contrib import admin
from member.models import UserProfile
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
class UserProfileInline(admin.StackedInline):
model = UserProfile
max_num = 1
can_delete = False
class UserAdmin(AuthUserAdmin):
inlines = [UserProfileInline]
# unregister old user admin
admin.site.unregister(User)
# register new user admin
admin.site.register(User, UserAdmin)
schlage ich eine weitere Verbesserung zu Robert Lösung:
from django.contrib import admin
from member.models import UserProfile
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
class UserProfileInline(admin.StackedInline):
model = UserProfile
max_num = 1
can_delete = False
class UserAdmin(AuthUserAdmin):
def add_view(self, *args, **kwargs):
self.inlines = []
return super(UserAdmin, self).add_view(*args, **kwargs)
def change_view(self, *args, **kwargs):
self.inlines = [UserProfileInline]
return super(UserAdmin, self).change_view(*args, **kwargs)
# unregister old user admin
admin.site.unregister(User)
# register new user admin
admin.site.register(User, UserAdmin)
Ohne diese Änderung zu Admin, der Brauch UserProfileInline Abschnitt wird auf dem „add user“ Bildschirm angezeigt, die nur angeblich für den Benutzernamen und das Passwort zu fragen. Und wenn Sie auf diesem Bildschirm eine der Profildaten ändern (weg von den Standardeinstellungen), bevor Sie speichern, werden Sie einen „doppelten Schlüssel“ Datenbankfehler erhalten.
Sie haben die Hinzufügen und Ändern von Form zu betrachten. Andernfalls erhalten Sie einen Benutzer kann nicht keine Fehler sein, wenn ein Benutzer zu erstellen versuchen. Im Folgenden wurde getestet und arbeitet in 1.3:
class TeamInline(admin.StackedInline):
model = Team
fk_name = 'user'
max_num = 1
can_delete = False
class TeamUserAdmin(UserAdmin):
list_display = ('username', 'email', 'company', 'expertise', 'contact_email', 'contact_phone', 'twitter', 'facebook', 'last_login_short', 'options')
list_select_related = True
def add_view(self, *args, **kwargs):
self.inline_instances = []
return super(TeamUserAdmin, self).add_view(*args, **kwargs)
def change_view(self, *args, **kwargs):
self.inline_instances.append(TeamInline(self.model, self.admin_site))
return super(TeamUserAdmin, self).change_view(*args, **kwargs)