De los documentos de Django.Contrib.Auth :
Ampliación del usuario predeterminado de Django Si está completamente satisfecho con el modelo de usuario de Django y solo desea agregar información de perfil adicional, simplemente puede
django.contrib.auth.models.AbstractUser
crear una subclase y agregar sus campos de perfil personalizados. Esta clase proporciona la implementación completa del usuario predeterminado como modelo abstracto.
Dicho y hecho. Creé un nuevo modelo como el siguiente:
class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)
Esto se muestra en admin casi como el estándar de Django User
. Sin embargo, la diferencia más importante en admin es que el campo de (re) establecer contraseña no está presente, sino que se muestra un CharField normal en su lugar. ¿Realmente tengo que anular cosas en la configuración de administración para que esto funcione? Si es así, ¿cómo puedo hacer eso de una manera algo SECA (es decir, sin copiar cosas de la fuente de Django ... eww ...)?
La respuesta de nico ha sido extremadamente útil, pero descubrí que Django todavía hace referencia al modelo de usuario al crear un nuevo usuario.
El ticket # 19353 hace referencia a este problema.
Para solucionarlo, tuve que hacer algunas adiciones más a
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)
fuente
forms.ValidationError
tiene un segundo argumentocode='duplicate_username'
:: github.com/django/django/blob/1.6/django/contrib/auth/… Además, probé esto en 1.6.5 y, por alguna razón, no necesitaba anularUserChangeForm
en absoluto y el formulario de cambio funcionó bien con mi campo personalizado. No puedo explicar por qué. Parece que no debería haber funcionado debido a que laUserChangeForm
clase tienemodel = User
presente: github.com/django/django/blob/1.6.5/django/contrib/auth/…Una solución más simple, 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 hará referencia correctamente al modelo MyUser para su creación y modificación. Estoy usando Django 1.6.2.
fuente
None
, déjelo , puede ingresar una cadena y se usará como el título de la sección en el formulario de administraciónERRORS: <class 'users.admin.CustomerUserAdmin'>: (admin.E005) Both 'fieldsets' and 'fields' are specified.
La respuesta de cesc no me funcionaba cuando intenté agregar un campo personalizado al formulario de creación. ¿Quizás ha cambiado desde 1.6.2? De cualquier manera, encontré que agregar el campo a ambos conjuntos de campos y add_fieldsets hizo el truco.
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)
fuente
Otra solución similar ( Tomó de aquí ):
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)
fuente
Solo haz lo siguiente
from django.contrib import admin from .models import MyUser admin.site.register(MyUser, admin.ModelAdmin)
Eso es. Se mostrarán todos los campos del modelo MyUser. La lista de campos de UserAdmin para mostrar está codificada (consulte su código fuente), pero ModelAdmin no. Es flexible
fuente
ModelAdmin
, no el personalizadoUserAdmin
. El resultado es un desastre.