customize - extend django user model




Utilizzando Django auth UserAdmin per un modello utente personalizzato (3)

Dopo aver scavato per un po 'il codice sorgente di Django, ho trovato un'anima funzionante. Non sono totalmente soddisfatto di questa soluzione, ma sembra funzionare. Sentiti libero di suggerirti soluzioni migliori!

Django utilizza UserAdmin per UserAdmin rendering dell'aspetto admin per il modello User . Usando questo nel nostro file admin.py , possiamo ottenere lo stesso aspetto del nostro modello.

from django.contrib.auth.admin import UserAdmin
admin.site.register(MyUser, UserAdmin)

Tuttavia, questo da solo probabilmente non è una buona soluzione, dal momento che Django Admin non mostrerà nessuno dei tuoi campi speciali. Ci sono due ragioni per questo:

  • UserAdmin utilizza UserChangeForm come modulo da utilizzare quando si modifica l'oggetto, che a sua volta utilizza User come modello.
  • UserAdmin definisce una serie di formsets proprietà, successivamente utilizzata da UserChangeForm , che non include i campi speciali.

Così, ho creato una speciale forma di cambiamento che sovraccarica la classe interna Meta in modo che la forma di cambiamento usi il modello corretto. Ho anche dovuto sovraccaricare UserAdmin per aggiungere i miei campi speciali al fieldset, che è la parte di questa soluzione che non mi piace un po ', dal momento che sembra un po' brutto. Sentiti libero di suggerire miglioramenti!

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = MyUser

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

    fieldsets = UserAdmin.fieldsets + (
            (None, {'fields': ('some_extra_data',)}),
    )


admin.site.register(MyUser, MyUserAdmin)

Dal documento Django.Contrib.Auth :

Estensione dell'utente predefinito di Django Se sei completamente soddisfatto del modello utente di Django e desideri solo aggiungere ulteriori informazioni sul profilo, puoi semplicemente sottoclasse django.contrib.auth.models.AbstractUser e aggiungi i campi del profilo personalizzato. Questa classe fornisce l'implementazione completa dell'utente predefinito come modello astratto.

Detto e fatto. Ho creato un nuovo modello come di seguito:

class MyUser(AbstractUser):
  some_extra_data = models.CharField(max_length=100, blank=True)

Questo si presenta in admin quasi come l' User standard di Django. Tuttavia, la differenza più importante in admin è che il campo password- (re) set non è presente, ma viene invece visualizzato un normale CharField. Devo davvero scavalcare la roba in admin-config per farlo funzionare? Se è così, come posso farlo in un modo un po 'ASCIUTTO (cioè senza copiare roba dalla fonte Django ... eww ...)?


La risposta di cesc non funzionava per me quando ho tentato di aggiungere un campo personalizzato al modulo di creazione. Forse è cambiato dalla 1.6.2? Ad ogni modo, ho trovato l'aggiunta del campo ad entrambi i fieldset e add_fieldsets ha fatto il trucco.

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)

Una soluzione più semplice, 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 farà correttamente riferimento al modello MyUser per la creazione e la modifica. Sto usando Django 1.6.2.





django-custom-user