2011-02-02 3 views
26

Per impostazione predefinita dopo l'accesso django reindirizza l'utente a una pagina account/profilo o se modifichi LOGIN_REDIRECT_URL puoi inviare l'utente a un'altra pagina specifichi in settings.py.Django - dopo il login, reindirizza l'utente alla sua pagina personalizzata -> mysite.com/username

Questo è ottimo ma vorrei che l'utente (dopo l'accesso) venisse reindirizzato a una pagina personalizzata in cui il collegamento a quella pagina sarebbe simile a questo: mysite.com/username. Pertanto, le impostazioni account/profilo o LOGIN_REDIRECT_URL di default non funzionerebbero in questo caso poiché entrambi sono in qualche modo statici. Nel mio caso la sezione username cambia per ogni utente.

Tutte le idee su come posso renderlo così quando l'utente è connesso andranno a una pagina utente personalizzata che ha il nome dell'utente nell'indirizzo come: mysite.com/username? Qualsiasi input è veramente apprezzato.

risposta

6

È possibile autenticare e registrare l'utente in come indicato qui: http://docs.djangoproject.com/en/dev/topics/auth/#how-to-log-a-user-in

Questo vi darà l'accesso all'oggetto utente da cui è possibile ottenere il nome utente e poi fare un HttpResponseRedirect per l'URL personalizzato.

+0

Ho dimenticato di dire che sto usando il django.contrib.auth.views che viene fornito con django. Posso avere l'url personalizzato sopra descritto in questo caso? – avatar

+1

Non sono sicuro che sia possibile personalizzare 'auth.views.login' in tale misura. Detto questo, vorrei solo scrivere la mia funzione di login, esattamente come quella nella documentazione che ho collegato sopra. –

55

Un approccio più semplice si basa sul reindirizzamento dalla pagina LOGIN_REDIRECT_URL. La cosa fondamentale da capire è che le informazioni dell'utente sono automaticamente incluse nella richiesta.

Supponiamo:

LOGIN_REDIRECT_URL = '/profiles/home' 

e si è configurato un URLPATTERN:

(r'^profiles/home', home), 

Poi, tutto quello che dovete scrivere per la vista home() è:

from django.http import HttpResponseRedirect 
from django.core.urlresolvers import reverse 
from django.contrib.auth.decorators import login_required 

@login_required 
def home(request): 
    return HttpResponseRedirect(
       reverse(NAME_OF_PROFILE_VIEW, 
         args=[request.user.username])) 

dove NAME_OF_PROFILE_VIEW è il nome della callback che stai utilizzando. Con i profili Django, NAME_OF_PROFILE_VIEW può essere 'profiles_profile_detail'.

+1

Che ne dici delle viste basate sulla classe? – User

+0

@User la vista 'home' può reindirizzare a qualsiasi pattern url, non importa se utilizza una vista basata su funzioni o una vista basata su classi. – Alasdair

0

Recentemente sono entrato nel django e ho cercato una soluzione e ho trovato un metodo che potrebbe essere utile.

Quindi, ad esempio, se si utilizza tutto il reindirizzamento predefinito è account/profilo. Fare una visione che reindirizza esclusivamente ad una posizione di scelta, utilizzando il campo nome utente in questo modo:

def profile(request): 
name=request.user.username 
return redirect('--choose where--/' + name + '/') 

quindi creare una vista che cattura in una delle tue applicazioni, ad esempio:

def profile(request, name): 
user = get_object_or_404(User, username=name) 
return render(request, 'myproject/user.html', {'profile': user}) 

Dove la cattura urlpatterns sarebbe simile a questa:

url(r'^(?P<name>.+)/$', views.profile, name='user') 

Funziona bene per me.

2

Sì! Nella tua settings.py definire quanto segue

LOGIN_REDIRECT_URL = '/your-path' 

e hanno '/ il-tuo-percorso' essere una semplice vista che guarda in alto self.request.user e fa tutto ciò la logica di cui ha bisogno per restituire un oggetto HttpResponseRedirect.

Un modo migliore potrebbe essere quello di definire un URL semplice come '/simple' che esegue la logica di ricerca. L'URL sembra più bello, ti risparmia un po 'di lavoro, ecc.

-3
return render(request,'page_location/page_name') 

return render(request,'home/page-login.html') 
+3

Potresti per favore formattare il codice evidenziandolo e premendo Ctrl + K – WhatsThePoint

Problemi correlati