2009-06-30 10 views
5

Sto cercando di capire meglio l'amministratore di django e, allo stesso tempo, sto cercando di aggiungere un altro campo all'attuale amministratore degli utenti. In models.py ho fattoPer l'amministratore di django, come posso aggiungere un campo al modello Utente e renderlo modificabile nell'amministratore?

User.add_to_class('new_field', models.BooleanField(default=False)) 

e admin.py ho ottenuto il seguente (con fieldsets fondamentalmente solo copiati da Django/contrib/auth/admin.py)

class AdjUserAdmin(UserAdmin): 
    list_display = UserAdmin.list_display + ('new_field',) 
    list_filter = UserAdmin.list_filter + ('new_field',) 

    fieldsets = UserAdmin.fieldsets 
    fieldsets[1][1]['fields'] = ('first_name','last_name','email','new_field') 

il problema è che, quando faccio questo ottengo l'errore:

AdjUserAdmin.fieldsets[4][1]['fields']' refers to field 'new_field' that is missing from the form.

ho guardato UserChangeForm, ma sembra come se fosse un è già in grado di inserire correttamente l'utente come modello. Non sono sicuro del motivo per cui new_field manca dal modulo.

Grazie

Per quanto riguarda questo codice puzzolente essendo

So che questo è un modo puzzolente scimmia patch per andare a fare questo, ma mi fa sottoclassi principalmente questioni per these ragioni .. se io potrebbe farlo funzionare come sopra indicato, sarei felice .. e forse puzzolente.

Per quanto riguarda il metodo consigliato

Sono a conoscenza del modo consigliato di creare un profilo utente, solo che in situazioni particolari, non vedo il merito nella creazione di un'intera nuova tabella e avere una chiamata aggiuntiva al database quando tutto ciò che voglio memorizzare è un ulteriore bit di informazioni come is_private o alcuni di questi. Se sto memorizzando molte più informazioni, allora sono d'accordo, la configurazione di un profilo utente è preferibile.

risposta

12

In primo luogo il "è collegato alla corrente?" domanda - Hai aggiunto manualmente new_field alla tabella utenti nel database? Syncdb non si sarebbe occupato di questo, ovviamente.

Dopo di che, vorrei provare aggiungendo i campi sul UserAdmin esistente, piuttosto che ricostruire da zero:

from django.contrib.auth.admin import UserAdmin 

UserAdmin.list_display += ('new_field',) # don't forget the commas 
UserAdmin.list_filter += ('new_field',) 
UserAdmin.fieldsets += ('new_field',) 
+1

Hmm .. dunno perché non ha ancora mi esimo inchiostro che dopo aver usato list_display = UserAdmin.list_display + ('new_field',) .. grazie! – Silfheed

+2

Quando uso: UserAdmin.list_display + = ('soprannome',) UserAdmin.list_filter + = ('soprannome',) UserAdmin.fieldsets + = ('soprannome',) <-----> c'è qualcosa che non va, come questo: : (admin.E008) Il valore di 'fieldsets [4]' deve essere una lista o tupla. <-----> e ho chang a: UserAdmin.list_display + = ('soprannome',) UserAdmin.list_filter + = ('soprannome',) UserAdmin.fieldsets + = (('soprannome', { 'campi': ('soprannome',)}),) <-----> questo problema è scomparso. – bovenson

4

E 'preferibile scrivere la propria classe profilo utente, e collegarlo al modello User. Quindi è possibile utilizzare il metodo get_profile() per recuperare il profilo dall'utente.

La sottoclasse dell'amministratore del profilo da un amministratore in linea dovrebbe consentire anche di modificare il profilo sulla pagina dell'utente, che è quasi ciò che si sta tentando di fare.

Questo post è davvero un buon write-up sul tema: http://www.b-list.org/weblog/2006/jun/06/django-tips-extending-user-model/

0

ho avuto la 'che manca dalla forma' errore, e scoprì che era dovuto al mio campo di essere contrassegnato come 'modificabile = Falso 'nel modello.

2

Nonostante il DB cerchi preoccupazioni per avere un profilo utente, questo è davvero il modo in cui dovresti affrontare questo problema.Ci sono due ragioni principali per questo:

  1. modello utente è abbastanza strettamente accoppiati al sistema di autenticazione di Django e molti altri plugin. Monkey patching non è una buona idea.

  2. Django è dotato di supporto per la creazione di profili utente e molte estensioni saper giocare bene con questi. Utilizzando i profili utente (vedi http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users per la discussione principale di questa) si può beneficiare di questo.

Se stai cercando di aggiungere funzionalità al l'interfaccia di amministrazione per gli utenti, allora questa nota può essere utile:

http://www.thenestedfloat.com/articles/displaying-custom-user-profile-fields-in-djangos-admin/index.html

saluti,

Ian

2
Proprio

capito, forse questo potrebbe aiutarti anche tu.

Dal momento che non parlare che si dispone di un profilo separato, se si desidera aggiungere semplicemente una colonna per l'utente Admin esistente, è possibile effettuare le seguenti operazioni in admin.py:

Prima si crea un amministratore personalizzato subclassing UserAdmin:

class CustomUserAdmin(UserAdmin): 
    list_display = UserAdmin.list_display + ('is_complete',) 

    def is_complete(self, obj): 
     # Example here, you can use any expression. 
     return SomeOtherClass.objects.get(my_field=obj).is_complete() 

    # Not required, but this gives you a nice boolean field: 
    is_complete.boolean = True 

Poi annullare la registrazione del già esistente UserAdmin e registrare il proprio:

admin.site.unregister(User) 
admin.site.register(User, CustomUserAdmin) 
Problemi correlati