web-dev-qa-db-fra.com

Le paramètre "next", redirect, Django.contrib.auth.login

J'essaie de rediriger les utilisateurs vers l'URL personnalisée "/gallery/(username)/" après la connexion. Il redirige actuellement vers l'URL "/account/profile/" par défaut. Bien que je sache ce que je peux remplacer par l'URL de redirection dans mon settings.py, mon URL est dynamique et ne fonctionnera donc pas.

La documentation indique que je dois utiliser le paramètre "next" et context processors.. J'ai le {{next}} dans mon modèle, mais je ne comprends pas comment passer le "/gallery/(username)". Toute aide serait grandement appréciée.

p.s: J'essaie d'éviter de créer ma propre vue de connexion.

26
django-d

J'avoue que j'utilise généralement 2 redirections afin de faire fonctionner quelque chose comme ça.

Commencez par créer votre propre page registration/login.html. Vous pouvez copier-coller l'exemple HTML dans cette section de la documentation d'authentification pour faciliter le processus. Au lieu d'utiliser la variable dynamique '{{ next }} du contexte, toutefois, indiquez la valeur de next pour accéder à une vue générique d'atterrissage des utilisateurs connectés.

<input type="submit" value="login" />
<input type="hidden" name="next" value="/gallery/" />

Ensuite, dans la vue que vous mappez sur l'URL /gallery/, extrayez l'objet Utilisateur de la demande (étant donné que l'utilisateur sera maintenant connecté, en particulier si la vue de la galerie est encapsulée dans un décorateur @permission_required ou @login_required. Utilisez cette vue pour rediriger vers la page de galerie spécifique à l'utilisateur appropriée:

@login_required
def gallery(request):
    url = '/gallery/%s/' % request.user.username
    return HttpResponseRedirect(url)
20
Jarret Hardie

La vue de connexion de Django Django.contrib.auth.views.login accepte un dictionnaire nommé extra_context. Les valeurs du dictionnaire sont directement transmises au modèle. Vous pouvez donc l'utiliser pour définir le paramètre next. Une fois que cela est fait, vous pouvez définir un champ masqué avec le nom next et la valeur {{ next }} afin qu'il soit rendu dans le modèle.

39
Guruprasad

Si vous avez déjà le modèle personnalisé pour le formulaire de connexion, vous devez ajouter les éléments suivants dans votre balise <form>:

<input type="hidden" name="next" value="{{next}}" />

BTW, vous n'avez pas à créer votre propre vue de connexion. Django.contrib.auth.views.login fonctionne bien. Il vous suffit de créer un modèle pour cela (registration/login.html)

7
Andrey Fedoseev

étant un débutant pour Django et tombant sur ce fil un peu plus ancien, j’ai trouvé une solution différente au problème de dynamiquement (= remplacer un paramètre personnalisé par défaut uniquement si nécessaire) en définissant le prochain paramètre que je voudrais partager (fonctionne parfaitement avec Django 1.5 , versions antérieures non testées):

tout comme Django-d, je voulais éviter la répétition et une connexion personnalisée, donc j’ai utilisé le stock Django.contrib.auth.views.login- en ajoutant la ligne de

url(r'^login/$', 'Django.contrib.auth.views.login', {'template_name': 'myapp/login.html',}, name='login'),

dans mon urls.py et dans l'élément de formulaire login.html-templates:

{% if not next or not next.strip %}
  {# avoid Django.contrib.auth.views.login s default of /account/profile/ #}
  {% url 'afterlogindefaultview' as next %}
{% endif %}
<input type="hidden" name="next" value="{{ next }}" />

qui, à mon sens, suit la pratique de découplage des configurations d'URL des vues . donc pour les vues qui doivent rediriger vers mon login d'applications et ensuite se diriger vers une vue autre que celle par défaut j'utilise

return HttpResponseRedirect('%s?next=%s' % (reverse('login'), reverse('mycustomnext')) )

de la vue où je veux que l'utilisateur se connecte. J'utilise ceci pour revenir à la vue où je me suis arrêté pour la connexion de l'utilisateur. 

5
antiplex

Vous pouvez utiliser une redirection statique vers /loggedin/, puis associer l'URL à une vue permettant une redirection correcte.

La connexion représente une étape supplémentaire, mais si vous souhaitez utiliser la vue de Django, elle fait le travail.

2
naw

créez votre propre vue pour vous connecter, avec sa propre URL, n'utilisez pas celle de l'administrateur . vous pouvez stocker la page suivante dans la session ou la transmettre en tant que paramètre GET à la vue de connexion (c'est-à-dire/login? next = gallery) n'oubliez pas de désinfecter et de valider cette valeur avant d'y accéder.

0
ozk