web-dev-qa-db-fra.com

Comment rediriger dans Django avec le contexte?

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.

48
Kevin

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

22
Manoj Govindan

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 %}
72
Antoine Pinsard

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})
12
Federer