web-dev-qa-db-fra.com

Comment passer des informations de contexte de modèle lorsque vous utilisez HTTPresponseredirect à Django?

J'ai une forme qui redirige vers la même page après qu'un utilisateur entre des informations (afin qu'ils puissent continuer à entrer des informations). Si la soumission du formulaire réussit, je retourne

HttpResponseRedirect(request.path)

ce qui fonctionne bien. Cependant, j'aimerais également afficher des messages à l'utilisateur dans ce cas (par exemple, "vos données ont été enregistrées" en haut de l'écran). Si je ne réorientitais pas, je retournerais ces messages dans le dictionnaire de contexte. Avec la redirection, cependant, je ne peux pas faire cela.

Alors, comment puis-je passer des informations de contexte de modèle lorsque vous utilisez HTTPresponseredirect?

Ce que j'essaie de faire semble être incroyablement commun, alors veuillez m'excuser s'il manque quelque chose d'évident.

40
Jeff

Le meilleur moyen serait probablement d'utiliser une requête codée sur l'URL de redirection ... sa ancienne approche scolaire.

Tu pourrais faire quelque chose comme

/ Page /? M = 1,/Page /? M = 2, etc.

Vous alliez ensuite analyser cette variable avec demande.Get dans le code de la vue et afficher le message approprié.

7
M. Ryan

Pour des raisons d'achèvement et de référence future, vous pouvez maintenant utiliser le cadre de messages . Après que vous l'installiez:

vues.py

from Django.contrib import messages

def view(request):
  # your code
  messages.success(request, "Your data has been saved!")
  HttpResponseRedirect(request.path)

template.html

{% if messages %}
<ul class="messages">
  {% for message in messages %}
  <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
  {% endfor %}
</ul>
{% endif %}
57
João Pesce

si vous utilisez authentifiant Auth et que vous avez un utilisateur connecté, vous pourriez:

http://docs.djangoproject.com/fr/dev/topics/auth/#django.contrib.auth.models.user.message_set.create

Obtenir des paramètres sont également piratables. Le QueryString, comme mentionné dans d'autres réponses, pourrait être utilisé.

Je pense que la manière la plus préférée serait d'utiliser le cadre de sessions. De cette façon, vous pouvez charger ce que vous voulez dans le contexte et obtenir

{{ request.session.foo }} 

foo pourrait être le message ou vous pourriez faire:

{% ifequal request.session.foo 1 %} Nice work! {% else %} Almost! {% endifequal %}

et autres choses amusantes.

http://docs.djangoproject.com/fr/dev/topics/http/sessions/#Uness-Sesss-in-views

11
Skylar Saveland

Vous ne pouvez pas. Httpresponseredirect envoie une redirection côté client (code d'état HTTP 302) sur le navigateur, puis le navigateur demande à nouveau une autre page.

Vous pouvez définir une chaîne de requête URL sur la redirection, bien que cela soit visible pour l'utilisateur et que toute personne intercepte des demandes HTTP (c'est-à-dire des proxies) et ne convient donc pas aux informations sensibles.

6
dcrosta

De vos points de vue.py Vous devez mettre une paire de clé/de valeur à la session, puis de le lire à partir du modèle HTML.

Par exemple:

vues.py

# your code here
request.session['vote'] = 1
return HttpResponseRedirect(request.path)

votre_template.html

{% ifequal request.session.vote 1 %}
    <!-- Your action here -->
{% endifequal  %}
2
Benny Neugebauer

La seule façon dont je connaisse de transmettre des données avec une redirection consiste à ajouter des paramètres d'accès à l'URL que vous passez. Pour éviter les hacks XSS, vous voudrez passer une constante spécifique comme:

[chemin actuel que vous passez]? Message = enregistré

Puis traiter le message = paramètre enregistré dans le gestionnaire pour le chemin que vous avez passé.

Un moyen un peu plus compliqué ne transmettrait pas les données de la redirection et à l'aide de quelque chose comme - http://code.google.com/p/django-notify/ Pour stocker des données basées sur la session qui est affiché à l'utilisateur après la redirection.

1
Ben Regenspan

Vous ajoutez? Sauvé = 1 à la chaîne de requête et vérifiez-la avec quelque chose comme:

saved = request.GET.get('saved', False)
0
Jeff Ober