2010-05-11 13 views
9

Voglio rendere i miei oggetti Utente tutti con lo stesso comportamento di base e per farlo ho bisogno di aggiungere un paio di metodi/proprietà all'utente anonimo.Qual è il modo migliore per estendere l'utente anonimo in Django?

Ho già creato una sottoclasse Utente per creare oggetti utente più ricchi, ma mi chiedevo se qualcuno ha fatto lo stesso per Utente Anonimo? E se ci sono dei modi migliori per farlo!

+2

Penso che il modo migliore per estendere il modello utente non sia la sottoclasse della classe 'User' ma creare una classe' UserProfile' separata, quindi aggiungere i campi desiderati e stabilire una relazione ForeignKey con la classe 'User' . –

+1

Sì, posso capire perché sarebbe preferibile, ma AnonymousUser non avrebbe comunque un profilo utente in quanto non c'è dove FK. La sottoclasse – Ross

risposta

8

Il suggerimento del middleware mi ha fatto riflettere e ora penso che l'idea migliore sia quella di sovrascrivere lo standard AuthenticationMiddleware. Quella classe assegna un oggetto LazyUser alla richiesta, che viene risolto all'utente corretto, quando vi si accede, chiamando contrib.auth.get_user. Questo è probabilmente il posto giusto per ignorare le cose, in modo che chiami la tua funzione personalizzata get_user che restituisce la sottoclasse AnonymousUser.

+1

Funziona a meraviglia Daniel! Ecco una copia per la prosperità: [custom auth backend] (http://gist.github.com/397817) – Ross

+0

Posterity, sry in anticipo, anche, grazie – jfunk

0

È consigliabile creare una sottoclasse o creare un modello con una relazione uno a uno con AnonymousUser class.

+0

sarebbe ideale, ma è più utile per praticarlo, dato che la classe AnonymousUser viene importata direttamente in un numero di punti. – Ross

2

Sto iniziando a pensare che un middleware è probabilmente la soluzione più semplice che controlla la classe request.user e se è AnonymousUser, quindi la sostituisce con una sottoclasse AnonymousUser che ha le proprietà aggiuntive.

Quel suono è ragionevole?

1

Un semplice e più generale (ma meno sicura) soluzione sarebbe quella di sostituire solo django.contrib.auth.models.AnonymousUser con la propria classe:

class YourAnonymousUser(...): 
    ... 


import django.contrib.auth.models as django_auth_models 
django_auth_models.AnonymousUser = YourAnonymousUser 

Come di 1.10.5, Django importa pigramente la classe utente anonimo, in modo da vincere incontrare problemi con il core Django. Raramente interagisci anche con AnonymousUser direttamente, dal momento che potresti semplicemente usare .is_anonymous(), quindi dovresti stare bene finché sai come le tue dipendenze usano AnonymousUser.

1

Il modo migliore consiste nell'utilizzare un pacchetto python (o scriverne uno proprio) che scambierà la classe AnonymousUser predefinita Django con la propria classe. È possibile implementare un middleware per questo (penso che sia il posto migliore).

Ad esempio, è possibile utilizzare django-custom-anonymous per fornire la personalizzazione di AnonymousUser. Inoltre lo puoi trovare su pypi.

+0

Mentre questo link può rispondere alla domanda, è meglio includere il parti essenziali della risposta qui e fornire il collegamento per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18949949) –

Problemi correlati