Z dokumentacji Django.Contrib.Auth :
Rozszerzanie domyślnego użytkownika Django Jeśli jesteś całkowicie zadowolony z modelu użytkownika Django i chcesz tylko dodać dodatkowe informacje o profilu, możesz po prostu utworzyć podklasę
django.contrib.auth.models.AbstractUser
i dodać własne pola profilu. Ta klasa zapewnia pełną implementację domyślnego User jako modelu abstrakcyjnego.
Powiedziane i zrobione. Stworzyłem nowy model jak poniżej:
class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)
To pojawia się w panelu administracyjnym prawie tak, jak w standardzie Django User
. Jednak najważniejszą różnicą w ustawieniach admin jest to, że nie ma pola ustawiania (ponownego) hasła, ale zamiast tego wyświetlany jest normalny CharField. Czy naprawdę muszę przesłonić rzeczy w admin-config, aby to zadziałało? Jeśli tak, jak mogę to zrobić w nieco SUCHY sposób (tj. Bez kopiowania rzeczy ze źródła Django… eww…)?
Odpowiedź nico była niezwykle pomocna, ale zauważyłem, że Django nadal odwołuje się do modelu użytkownika podczas tworzenia nowego użytkownika.
Bilet nr 19353 odnosi się do tego problemu.
Aby to naprawić, musiałem zrobić kilka dodatkowych dodatków
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)
źródło
forms.ValidationError
ma drugi argumentcode='duplicate_username'
:: github.com/django/django/blob/1.6/django/contrib/auth/ ... Poza tym próbowałem tego w 1.6.5 iz jakiegoś powodu w ogóle nie trzeba było nadpisywać,UserChangeForm
a formularz zmiany działał dobrze z moim polem niestandardowym. Nie potrafię wyjaśnić dlaczego. Wygląda na to, że nie powinno to zadziałać, ponieważUserChangeForm
klasa mamodel = User
obecną: github.com/django/django/blob/1.6.5/django/contrib/auth/ ...Prostsze rozwiązanie, 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 będzie poprawnie odwoływać się do modelu MyUser podczas tworzenia i modyfikacji. Używam Django 1.6.2.
źródło
None
, możesz wpisać ciąg znaków, który będzie używany jako tytuł sekcji w formularzu administratoraERRORS: <class 'users.admin.CustomerUserAdmin'>: (admin.E005) Both 'fieldsets' and 'fields' are specified.
Odpowiedź cesc nie działała dla mnie, gdy próbowałem dodać niestandardowe pole do formularza tworzenia. Może to się zmieniło od wersji 1.6.2? Tak czy inaczej, stwierdziłem, że dodanie pola do obu zestawów pól i add_fieldsets załatwiło sprawę.
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)
źródło
Inne podobne rozwiązanie ( wzięte stąd ):
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)
źródło
Po prostu wykonaj następujące czynności
from django.contrib import admin from .models import MyUser admin.site.register(MyUser, admin.ModelAdmin)
Otóż to. Zostaną wyświetlone wszystkie pola modelu MyUser. Lista pól UserAdmin do wyświetlenia jest zakodowana na stałe (zobacz kod źródłowy), ale ModelAdmin nie. Jest elastyczny.
źródło
ModelAdmin
, a nie dostosowanejUserAdmin
. Rezultatem jest bałagan.