2010-08-04 13 views
30

Il mio sito utilizza il modello User Authentication User di Django e un modello UserProfile personalizzato per memorizzare alcuni dati aggiuntivi (compleanno, ecc.). C'è un modo per creare una vista nell'amministratore di Django che tesse insieme i campi dei modelli User e UserProfile?Django Admin: come visualizzare i campi da due modelli diversi nella stessa vista?

ho il sospetto che questo frammento di codice non è nemmeno vicino, ma forse sarà illustrare quello che sto cercando di fare: messaggio

from django.contrib import admin 
from django.contrib.auth.models import User 
from userprofile.models import UserProfile 


class UserProfileAdmin(admin.ModelAdmin): 
    list_display = ('name', 'gender', 'User.email') #user.email creates the error - tried some variations here, but no luck. 

admin.site.register(UserProfile, UserProfileAdmin) 

Errore:

ImproperlyConfigured: UserProfileAdmin.list_display [2], 'User.email' non è un callable o un attributo di 'UserProfileAdmin' o trovato nel modello 'UserProfile'.

In definitiva, sto cercando di creare una visualizzazione di amministrazione che ha il primo cognome & da UserProfile e e-mail dell'utente.

risposta

37

per la visualizzazione utente di posta elettronica è necessario disporre di un metodo su UserProfile o UserProfileAdmin che restituisce l'e-mail

su ProfiloUtente

def user_email(self): 
    return self.user.email 

o su UserProfileAdmin

def user_email(self, instance): 
    return instance.user.email 

poi cambiare list_display a

list_display = ('name', 'gender', 'user_email') 
+1

Abbastanza sicuro che tu possa semplicemente usare la doppia notazione underscore user__email senza dover definire la funzione extra – Hugoagogo

+1

@Hugoagogo In realtà non è possibile. Ecco il [biglietto per esso] (https://code.djangoproject.com/ticket/5863) chiuso come non risolverà. –

+0

Apparentemente oggi, è fisso ... Lo stesso link alla fine! – HydrUra

14

Si potrebbe provare a utilizzare InlineModelAdmin per visualizzare i moduli Utente e Modulo Utente in una visualizzazione di amministrazione.

Per visualizzare le informazioni del profilo utente nella lista il cambiamento è possibile creare un nuovo metodo che i delegati dei valori da UserProfile a User modello.

Per esempio, questo dovrebbe funzionare più o meno :)

from django.contrib import admin 
from django.contrib.auth.models import User 

from my_models import UserProfile 

class UserProfileInline(admin.StackedInline): 
    model = UserProfile 
    fk_name = 'user' 

class UserAdmin(admin.ModelAdmin): 
    list_display = ['get_userprofile_name', 'email'] 
    list_select_related = True 
    inlines = [ 
     UserProfileInline, 
    ] 

    def get_userprofile_name(self, instance): 
     # instance is User instance 
     return instance.get_profile().name 

admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 
+0

Grazie per la risposta. Risulta che quello di Ashok era esattamente quello di cui avevo bisogno, ma sto guardando anche a questo approccio. Apprezzalo. – Joe

+0

Passato un po 'di tempo con questo - funziona anche. Domanda successiva: non riesco ad accedere ad alcune proprietà definite su UserProfile da UserProfileInline. C'è un modo per fare questo? – Joe

+1

"classe UserAdmin (UserAdmin):" riga deve essere corretta come "classe UserAdmin (admin.ModelAdmin):" – israkir

1

Utilizzando Ashoks top risposta ho fatto frammento che semplifica il processo per gran numero di campi

class ColumnViewer(object): 
    pass 

column_list = ('name', 'surname',) 

for col in column_list: 
    setattr(ColumnViewer, col, lambda s,i : getattr(i, col)) 

@admin.register(UserProfile) 
class UserProfileAdmin(admin.ModelAdmin, ColumnViewer): 
    list_display = column_list 
Problemi correlati