Question

J'essaie de rediriger un utilisateur vers une URL contenant son nom d'utilisateur (comme http: // domaine / nom d'utilisateur / ), et essayer de comprendre comment faire cela. J'utilise django.contrib.auth pour la gestion de mes utilisateurs. J'ai donc essayé d'utiliser LOGIN_REDIRECT_URL dans les paramètres:

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

mais il ne semble accepter que des chaînes fixes, plutôt que quelque chose qui sera déterminé après la connexion de l'utilisateur. Comment puis-je toujours y parvenir?

Était-ce utile?

La solution

Une solution consiste à rediriger vers une route statique telle que '/ userpage /' et de la rediriger vers la page dynamique finale.

Mais je pense que la vraie solution est de créer une nouvelle vue qui fasse ce que vous voulez vraiment.

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 / fr / dev / topics / auth / # authentification sur le Web

pour plus d'informations sur la réécriture de la vue. C’est ainsi que les docs disent de remplacer ce genre de chose.

Autres conseils

Placez la vue d'authentification dans votre propre vue personnalisée et redirigez-la où bon vous semble si l'authentification réussit.

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

Une autre alternative consiste à utiliser le paramètre de requête next pour indiquer la redirection vers laquelle se connecter après la connexion.

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

Avec le django.contrib.auth.views.LoginView basé sur les classes, vous pouvez maintenant simplement remplacer 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

<*>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top