Aus den Django.Contrib.Auth-Dokumenten :
Erweitern des Standardbenutzers von Django Wenn Sie mit dem Benutzermodell von Django vollkommen zufrieden sind und nur einige zusätzliche Profilinformationen hinzufügen möchten, können Sie einfach
django.contrib.auth.models.AbstractUser
Ihre benutzerdefinierten Profilfelder unterordnen und hinzufügen. Diese Klasse bietet die vollständige Implementierung des Standardbenutzers als abstraktes Modell.
Gesagt, getan. Ich habe ein neues Modell wie folgt erstellt:
class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)
Dies zeigt sich in admin fast wie Djangos Standard User
. Der wichtigste Unterschied in admin besteht jedoch darin, dass das Feld zum (erneuten) Festlegen des Kennworts nicht vorhanden ist, sondern stattdessen ein normales CharField angezeigt wird. Muss ich wirklich Dinge in der Admin-Konfiguration überschreiben, damit dies funktioniert? Wenn ja, wie kann ich das auf etwas TROCKENE Weise tun (dh ohne Sachen aus der Django-Quelle zu kopieren ... eww ...)?
Die Antwort von nico war äußerst hilfreich, aber ich fand, dass Django beim Erstellen eines neuen Benutzers immer noch auf das Benutzermodell verweist.
Ticket Nr. 19353 verweist auf dieses Problem.
Um das Problem zu beheben, musste ich noch einige Ergänzungen vornehmen
admin.py
admin.py:
from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.forms import UserChangeForm, UserCreationForm from main.models import MyUser from django import forms class MyUserChangeForm(UserChangeForm): class Meta(UserChangeForm.Meta): model = MyUser class MyUserCreationForm(UserCreationForm): class Meta(UserCreationForm.Meta): model = MyUser def clean_username(self): username = self.cleaned_data['username'] try: MyUser.objects.get(username=username) except MyUser.DoesNotExist: return username raise forms.ValidationError(self.error_messages['duplicate_username']) class MyUserAdmin(UserAdmin): form = MyUserChangeForm add_form = MyUserCreationForm fieldsets = UserAdmin.fieldsets + ( (None, {'fields': ('extra_field1', 'extra_field2',)}), ) admin.site.register(MyUser, MyUserAdmin)
quelle
forms.ValidationError
ein zweites Argument hat:code='duplicate_username'
: github.com/django/django/blob/1.6/django/contrib/auth/... Auch habe ich versucht , dies auf 1.6.5 und aus irgendeinem Grund, ich musste überhaupt nicht überschrieben werdenUserChangeForm
und das Änderungsformular funktionierte gut mit meinem benutzerdefinierten Feld. Ich kann nicht erklären warum. Es scheint, als hätte es nicht funktionieren sollen, weil dieUserChangeForm
Klassemodel = User
anwesend war: github.com/django/django/blob/1.6.5/django/contrib/auth/…Eine einfachere Lösung, admin.py:
from django.contrib.auth.admin import UserAdmin from main.models import MyUser class MyUserAdmin(UserAdmin): model = MyUser fieldsets = UserAdmin.fieldsets + ( (None, {'fields': ('some_extra_data',)}), ) admin.site.register(MyUser, MyUserAdmin)
Django verweist beim Erstellen und Ändern korrekt auf das MyUser-Modell. Ich benutze Django 1.6.2.
quelle
None
können Sie eine Zeichenfolge eingeben, die als Titel des Abschnitts im Administrationsformular verwendet wirdERRORS: <class 'users.admin.CustomerUserAdmin'>: (admin.E005) Both 'fieldsets' and 'fields' are specified.
Die Antwort von cesc funktionierte nicht für mich, als ich versuchte, dem Erstellungsformular ein benutzerdefiniertes Feld hinzuzufügen. Vielleicht hat es sich seit 1.6.2 geändert? In beiden Fällen habe ich festgestellt, dass das Hinzufügen des Felds zu beiden Feldsätzen und add_fieldsets den Trick ausgeführt haben.
ADDITIONAL_USER_FIELDS = ( (None, {'fields': ('some_additional_field',)}), ) class MyUserAdmin(UserAdmin): model = MyUser add_fieldsets = UserAdmin.add_fieldsets + ADDITIONAL_USER_FIELDS fieldsets = UserAdmin.fieldsets + ADDITIONAL_USER_FIELDS admin.site.register(MyUser, MyUserAdmin)
quelle
Eine andere ähnliche Lösung ( von hier übernommen ):
from __future__ import unicode_literals from django.contrib import admin from django.contrib.auth.admin import UserAdmin from django.contrib.auth.models import AbstractUser from django.utils.translation import ugettext_lazy as _ from .models import User class UserAdminWithExtraFields(UserAdmin): def __init__(self, *args, **kwargs): super(UserAdminWithExtraFields, self).__init__(*args, **kwargs) abstract_fields = [field.name for field in AbstractUser._meta.fields] user_fields = [field.name for field in self.model._meta.fields] self.fieldsets += ( (_('Extra fields'), { 'fields': [ f for f in user_fields if ( f not in abstract_fields and f != self.model._meta.pk.name ) ], }), ) admin.site.register(User, UserAdminWithExtraFields)
quelle