J'essaie de créer un site Web simple avec une fonctionnalité de connexion très similaire à celle ici sur SO. L'utilisateur doit pouvoir naviguer sur le site en tant qu'utilisateur anonyme et il y aura un lien de connexion sur chaque page. En cliquant sur le lien de connexion, l'utilisateur sera dirigé vers le formulaire de connexion. Après une connexion réussie, l'utilisateur doit être ramené à la page à partir de laquelle il a cliqué sur le lien de connexion en premier lieu. Je suppose que je dois en quelque sorte transmettre l'URL de la page actuelle à la vue qui gère le formulaire de connexion, mais je ne peux pas vraiment le faire fonctionner.
EDIT: je l'ai compris. J'ai lié au formulaire de connexion en passant la page actuelle en tant que paramètre GET, puis j'ai utilisé «suivant» pour rediriger vers cette page. Merci!
EDIT 2: Mon explication ne semblait pas claire donc comme demandé voici mon code: Disons que nous sommes sur une page foo.html et que nous ne sommes pas connectés. Maintenant, nous aimerions avoir un lien sur foo.html qui lie à login.html. Là, nous pouvons nous connecter et nous sommes ensuite redirigés vers foo.html. Le lien sur foo.html ressemble à ceci:
<a href='/login/?next={{ request.path }}'>Login</a>
Maintenant, j'ai écrit une vue de connexion personnalisée qui ressemble un peu à ceci:
def login_view(request):
redirect_to = request.REQUEST.get('next', '')
if request.method=='POST':
#create login form...
if valid login credentials have been entered:
return HttpResponseRedirect(redirect_to)
#...
return render_to_response('login.html', locals())
Et la ligne importante dans login.html:
<form method="post" action="./?next={{ redirect_to }}">
Alors oui, c'est à peu près tout, espérons que cela soit clair.
Réponses:
Vous n'avez pas besoin de créer une vue supplémentaire pour cela, la fonctionnalité est déjà intégrée.
Tout d'abord, chaque page avec un lien de connexion doit connaître le chemin actuel, et le moyen le plus simple est d'ajouter le préprocesseur de contexte de requête à settings.py (les 4 premiers sont par défaut), puis l'objet de requête sera disponible dans chaque requête:
settings.py:
Ensuite, ajoutez dans le modèle que vous voulez le lien de connexion:
base.html:
Cela ajoutera un argument GET à la page de connexion qui pointe vers la page actuelle.
Le modèle de connexion peut alors être aussi simple que ceci:
registration / login.html:
la source
request.path
est nulle, donc je la fais{% firstof request.path '/' %}
, de cette façon si le chemin de la demande n'est pas disponible pour une raison quelconque, l'utilisateur est envoyé à la page d'accueil.<a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>
place.next
serait quelque chose comme/accounts/logout/
et après la connexion de l'utilisateur, il sera immédiatement déconnecté lol, et la boucle continue.Ce n'est peut-être pas une "meilleure pratique", mais j'ai déjà utilisé ceci avec succès:
la source
Pour prendre en charge les URL complètes avec des paramètres / valeurs dont vous avez besoin:
au lieu de seulement:
la source
L'authentification intégrée de Django fonctionne comme vous le souhaitez.
Leurs pages de connexion incluent une
next
chaîne de requête qui est la page à laquelle revenir après la connexion.Regardez http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required
la source
J'ai lié au formulaire de connexion en passant la page actuelle en tant que paramètre GET, puis j'ai utilisé «suivant» pour rediriger vers cette page. Merci!
la source
J'ai rencontré le même problème. Cette solution me permet de continuer à utiliser la vue générique de connexion:
la source
Dans
registration/login.html
(imbriqué dans letemplates
dossier) si vous insérez la ligne suivante, la page s'affichera comme la page de connexion administrateur d'origine de Django:Remarque: le fichier ne doit contenir que les lignes ci-dessus.
la source
Consultez la documentation de django pour views.login () , vous fournissez une valeur 'next' (sous forme de champ caché) sur le formulaire d'entrée vers laquelle rediriger après une connexion réussie.
la source
Vous pouvez également le faire
la source