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.

45
demandé sur Kevin 2010-09-02 10:54:17

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

20
répondu Manoj Govindan 2017-02-08 14:43:46

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 %}
63
répondu Antoine Pinsard 2015-10-21 11:00:59

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})
9
répondu Federer 2016-01-07 11:09:58