2012-12-01 6 views
5

Ho creato un modello utente personalizzato che sto utilizzando con successo all'interno della mia app.Il modello utente personalizzato in django non consente l'impostazione della password nell'amministratore

Il problema è che all'interno dell'Amministratore, nella schermata di modifica dell'utente, viene visualizzata l'hash della password attuale, invece dell'interfaccia molto utile per l'impostazione della password.

Sto utilizzando Django 1.5b1 su Python 2.7.

Come posso convincere l'amministratore di Django a trattare il mio modello utente nello stesso modo in cui tratta l'utente nativo, nell'interesse dell'interfaccia utente di amministrazione?

risposta

9

La documentazione suggerisce che è necessario registrare il modello personalizzato con admin e anche definire alcuni metodi in modo che l'interfaccia di amministrazione funzioni con il modello utente personalizzato.

Potrebbe anche essere necessario definire moduli incorporati per Utente.

Da Custom users and django.contrib.admin

Sarà inoltre necessario registrare il modello User personalizzato con l'amministratore. Se il tuo modello utente personalizzato estende AbstractUser, puoi utilizzare la classe UserAdmin esistente di Django. Tuttavia, se il modello utente estende AbstractBaseUser, sarà necessario definire una classe ModelAdmin personalizzata.

+1

Ha funzionato! Ulteriori dettagli: il mio modello non è basato su UserAdmin, ma guarda, parla, cammina come se fosse uno (ha gli stessi campi e altro). Sono stato in grado di registrare il mio admin del modello personalizzato che ho creato con il minimo sforzo e la duplicazione del codice. L'amministratore del mio modello estende django.contrib.auth.admin.UserAdmin e sostituisce campi, forma e add_form. form e add_form, a turno, puntano a moduli personalizzati che estendono l'UserCreationForm e UserChangeForm forniti da Django e sovrascrivono la sottoclasse Meta per puntare al mio modello. È incredibile come questa roba funzioni insieme! Inoltre, puntelli per battere a macchina. –

0

Se si sta estendendo AbstractBaseUser, sono necessari due moduli, un modulo di creazione e un modulo di aggiornamento senza le password, derivato da ModelForm.

Poi nella forma Admin, specificare creare e aggiornare forme separate, insieme con fieldsets corrispondenti:

class MyUserAdmin(UserAdmin): 
    # The forms to add and change user instances 
    form = UserChangeForm 
    add_form = UserCreationForm 

    fieldsets = (
     (None, {'fields': ('email', 'first_name', 'last_name')}), 
    ) 
    add_fieldsets = (
     (None, {'fields': ('email', 'password', 'password2', 'first_name', 'last_name')}), 
    ) 

password per i nuovi utenti funzionerà. Esegui le modifiche della password nel modulo django predefinito anziché nell'admin.

1

Basta aggiungere questo al modulo:

password = ReadOnlyPasswordHashField(
     label= ("Password"), 
     help_text= ("Raw passwords are not stored, so there is no way to see " 
        "this user's password, but you can change the password " 
        "using <a href=\"password/\">this form</a>.")) 

preso in prestito da https://stackoverflow.com/a/15630360/780262

0

Almeno in 1.10, sono stato in grado di fare quanto segue. Più semplice di quanto sopra. Lo metto in admin.py:

from django.contrib.auth.admin import UserAdmin 
from django.contrib import admin 
from myapp.models import MyUser 

class MyUserAdmin(UserAdmin): 
    model = MyUser 

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

admin.site.register(MyUser, MyUserAdmin) 
Problemi correlati