Comment puis-je rediriger en Django avec contexte?
j'ai une vue qui valide et enregistre un formulaire. Après que le formulaire soit sauvegardé, je voudrais rediriger de nouveau à une vue list_object avec un message de succès " le formulaire pour le client xyz a été mis à jour avec succès..."
HttpResponseRedirect ne semble pas fonctionner, car il n'a qu'un argument pour l'url, aucun moyen de passer le dictionnaire avec lui.
j'ai essayé de modifier mon wrapper pour object_list pour prendre un dict comme paramètre qui a le contexte nécessaire. J'ai le retour d'un appel à cet emballage de l'intérieur de la vue qui sauve la forme. Toutefois, lorsque la page est affichée, l'url est "/customer_form/ "plutôt que" /list_customers/'. J'ai essayé de modifier l'objet request, avant de le passer à object_list wrapper, mais cela n'a pas fonctionné.
Merci.
3 réponses
Veuillez noter que la réponse proposée ici n'est applicable qu'à Django < 1.2:
avez-vous le contrôle sur la vue que vous redirigez? Dans ce cas, vous pouvez sauvegarder le contexte dans la session avant de rediriger. La vue cible peut prendre le contexte (et le supprimer) de la session et l'utiliser pour rendre le modèle.
Si votre exigence est d'afficher un message, puis il y a une meilleure façon de le faire. Votre premier point de vue peut créer un message pour le courant en utilisant auth
et faites Lire la deuxième vue et supprimez-la. Quelque chose comme ceci:
def save_form(request, *args, **kwargs):
# all goes well
message = _("form for customer xyz was successfully updated...")
request.user.message_set.create(message = message)
return redirect('list_view')
def list_view(request, *args, **kwargs):
# Render page
# Template for list_view:
{% for message in messages %}
...
{% endfor %}
les Messages sont sauvegardés dans la base de données. Cela signifie que vous pouvez y accéder même après une redirection. Ils sont automatiquement lus et supprimé lors du rendu du modèle. Vous devrez utiliser RequestContext
pour que cela fonctionne.
Pour Django => 1.2 lire la réponse impliquant des messages
request.user.message_set
a été déprécié dans Django 1.2 et a été supprimé depuis Django 1.4, le message de cadre doit être utilisé à la place.
from django.contrib import messages
# messages.add_message(request, level, message, extra_tags='', fail_silently=False)
messages.add_message(request, messages.INFO, "Your Message")
les Messages peuvent alors être rendus sur le modèle avec:
{% if messages %}
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
pour développer la réponse utile D'Antoine: si vous voulez traiter les messages dans votre module vues, plutôt que le modèle:
from django.contrib.messages import get_messages
def my_view(request):
# Process your form data from the POST, or whatever you need to do
# Add the messages, as mentioned above
messages.add_message(request, messages.INFO, form.cleaned_data['name'])
return HttpResponseRedirect('/other_view_url/')
def other_view(request):
storage = get_messages(request)
name = None
for message in storage:
name = message
break
return render(request, 'general/other_view.html', {'name': name})