J'ai une vue qui valide et enregistre un formulaire. Une fois le formulaire enregistré, je voudrais rediriger vers une vue list_object avec un message de réussite "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.
J'ai essayé de modifier mon wrapper pour object_list pour prendre un dict comme paramètre qui a le contexte nécessaire. Je retourne un appel à ce wrapper depuis l'intérieur de la vue qui enregistre le formulaire. Cependant, lorsque la page est rendue, l'url est '/ customer_form /' plutôt que '/ list_customers /'. J'ai essayé de modifier l'objet de demande, avant de le passer à l'encapsuleur object_list, mais cela n'a pas fonctionné.
Merci.
Veuillez noter que la réponse suggérée ici ne s'applique qu'à Django <1.2:
Avez-vous le contrôle sur la vue vers laquelle vous redirigez? Dans ce cas, vous pouvez enregistrer le contexte dans la session avant de rediriger. La vue cible peut récupérer le contexte (et le supprimer) de la session et l'utiliser pour rendre le modèle.
Si votre seule exigence est d'afficher un message, il existe un meilleur moyen de le faire. Votre première vue peut créer un message pour le courant en utilisant auth
et faire lire et supprimer la deuxième vue. Quelque chose comme ça:
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 enregistré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és 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éconseillé dans Django 1.2 et a été supprimé depuis Django 1.4, le structure de message 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 ensuite être restitués 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 souhaitez traiter les messages dans votre module de 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})