Domanda

Sto cercando di reindirizzare un utente a un URL contenente il suo nome utente (come http: // domain / username / ), e cercando di capire come farlo. Sto usando django.contrib.auth per la gestione dei miei utenti, quindi ho provato a utilizzare LOGIN_REDIRECT_URL nelle impostazioni:

LOGIN_REDIRECT_URL = '/%s/' % request.user.username # <--- fail..

ma sembra accettare solo stringhe fisse, piuttosto che qualcosa che verrà determinato dopo l'accesso dell'utente. Come posso ancora realizzare questo?

È stato utile?

Soluzione

Una soluzione è reindirizzare a una route statica come '/ userpage /' e avere quel reindirizzamento alla pagina dinamica finale.

Ma penso che la vera soluzione sia quella di creare una nuova visione che faccia quello che vuoi davvero.

from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            HttpResponseRedirect('/%s/'%username) 
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

http://docs.djangoproject.com / it / dev / argomenti / auth / # autenticazione-in-web richieste

per ulteriori informazioni sulla riscrittura della vista. È così che dicono i documenti per sovrascrivere questo tipo di cose.

Altri suggerimenti

Avvolgi la vista auth nella tua vista personalizzata e reindirizza dove vuoi se l'autenticazione ha avuto successo.

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

def login(request):
    template_response = auth.views.login(request)

    if isinstance(template_response, HttpResponseRedirect) and template_response.url == '/accounts/profile/':
        return HttpResponseRedirect(reverse('user', args=(request.user.username,)))


    return template_response

Un'altra alternativa è utilizzare la query param next per indicare dove reindirizzare dopo il login.

<a href="{% url 'login' %}?next={{ request.path }}">sign in</a>

Con il basato su classi django.contrib.auth.views.LoginView , ora puoi semplicemente ignorare get_success_url :

urls.py:

url(r'^login

views.py

class MyLoginView(LoginView):

    def get_success_url(self):
        return reverse('my_account', args=[self.request.user.username])
, MyLoginView.as_view(), name='login'), url(r'^users/(?P<username>[a-zA-Z0-9]+)

views.py

<*>, MyAccountView.as_view(), name='my_account'),

views.py

<*>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top