2009-11-11 16 views
6

ho esteso classe utente predefinita di Django come questo:Django: usa una classe personalizzata per request.user?

class CustomUser(User): 
    friends = models.ManyToManyField('self', symmetrical=False) 

Ma ora voglio usare che ovunque al posto della classe predefinita User. Secondo la mia opinione, ho accesso a request.user ma questa è un'istanza della classe User. Qual è il modo più semplice per farlo restituire un CustomUser? .

risposta

6

puoi anche "scovare" il modello utente esistente da qualche parte nel tuo model.py e dovrebbe funzionare. Nel tuo codice continui a utilizzare la classe originale.

User.add_to_class('friends',models.ManyToManyField('self', symmetrical=False)) 
+0

Oh! Vorrei saperlo qualche giorno fa. Ma grazie! Ho finito quel progetto, quindi non ho intenzione di tornare indietro e provare questo adesso; Prenderò solo questo funziona. Sarebbe stata la soluzione più semplice. – mpen

+0

sicuro, piccola modifica anche se nella sintassi (ho usato friends = models.ManyToMany) la prima volta – Evgeny

1

Penso che la soluzione più rapida per il problema sarebbe semplicemente chiamare CustomUser.objects.get(user=user) (questo utente sta assumendo è un attributo nel modello CustomUser Quello che vorrei fare è la seguente:

class CustomUser(models.Model): 
    user = models.ForeignKey(User, unique=True) 

così quando si arriva un queryset di CustomUsers, è possibile filtrare quello desiderato in base all'utilizzo di un filtro dell'utente su richiesta.

In alternativa, è possibile modificare il middleware in modo che includa CustomUser anziché utenti, ma non sono sicuro di come per farlo;)

EDIT: Mark mi ha detto che preferirebbe usare l'ereditarietà, quindi è in grado di usare tutti i metodi personalizzati di User, il che ha senso e così ho trovato un articolo per risolvere questo problema bene.

Here è.

+0

Il problema con l'utilizzo di una chiave esterna invece di ereditarietà python è che non si ottiene l'accesso a tutti i metodi personalizzati. Forse c'è un modo per interrogarlo invece ... – mpen

+1

Ah, capisco di cosa stavi parlando. Penso che questo collegamento ti fornisca esattamente quello che stai cercando! http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/ – shawnjan

+0

Sì, ci sto provando ma non sembra che stia usando il mio ModelBackend ... sta ancora utilizzando quello predefinito, anche se ho specificato 'AUTHENTICATION_BACKENDS' ... – mpen

5

Non sono sicuro che sia possibile farlo esattamente, ma è possibile accedere agli attributi CustomUser utilizzando la funzione user_profile di Django.

Nel vostro settings.py:

AUTH_PROFILE_MODULE = 'myapp.CustomUser' 

Secondo lei:

user_friends = user.get_profile().friends 

Dai un'occhiata a questo link per maggiori informazioni.

+0

Penso che questo richieda di impostare 'Utente' come chiave esterna, piuttosto che ereditarietà come sto usando ... – mpen

+0

Questo è il modo corretto di farlo. –

+1

Questo è il modo preferito per gestire il tuo problema. Ti evita di dover modificare i moduli esistenti. Lascia solo django.contrib.auth e apporta le modifiche al tuo codice. – jcdyer

3

È tutto spiegato here. Il problema request.user è stato risolto utilizzando un back-end di autenticazione. Ho implementato un utente personalizzato secondo le istruzioni dell'autore e sono stato felice da allora.

+0

L'ho trovato e l'ho provato, ma non riuscivo a farlo funzionare. IMO, non dovresti nemmeno dover sostituire il back-end. – mpen

+0

Qual era il problema? Sono a mio agio con il backend personalizzato, ma se non vuoi usarlo puoi scrivere un middleware, come suggerito in uno dei commenti a quel post. – shanyu

+0

Questa è la soluzione 'teh win' qui. Una piccola quantità di codice di colla e non dovrai mai più preoccuparti di questo. Ovunque nella tua app ottiene il tuo modello utente personalizzato. –

Problemi correlati