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:

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)?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top