ti-enxame.com

Como redireciono em Django com contexto?

Eu tenho uma visão que valida e salva um formulário. Depois que o formulário é salvo, eu gostaria de redirecionar de volta para uma exibição list_object com uma mensagem de sucesso "o formulário para o cliente xyz foi atualizado com sucesso ..."

O HttpResponseRedirect não parece que funcionaria, porque só possui um argumento para o URL, não há como passar o dicionário com ele.

Eu tentei modificar meu wrapper para object_list para tomar um ditado como um parâmetro que possui o contexto necessário. Retorno uma chamada para este wrapper de dentro da visualização que salva o formulário. No entanto, quando a página é renderizada, o URL é '/ customer_form /' em vez de '/ list_customers /'. Tentei modificar o objeto de solicitação antes de passá-lo para o wrapper object_list, mas isso não funcionou.

Obrigado.

48
Kevin

Observe que a resposta sugerida aqui é aplicável apenas a Django <1.2:

Você tem controle sobre a exibição para a qual está redirecionando? Nesse caso, você pode salvar o contexto na sessão antes de redirecionar. A visualização de destino pode pegar o contexto (e excluí-lo) da sessão e usá-lo para renderizar o modelo.

Se o seu único requisito é exibir uma mensagem, existe uma maneira melhor de fazer isso. Sua primeira visualização pode criar uma mensagem para a atual usando auth e ter a segunda visualização lida e excluída. Algo assim:

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 %}

As mensagens são salvas no banco de dados. Isso significa que você pode acessá-los mesmo após um redirecionamento. Eles são lidos automaticamente e excluídos na renderização do modelo. Você terá que usar RequestContext para que isso funcione.

Para Django => 1.2 leia a resposta envolvendo mensagens

22
Manoj Govindan

request.user.message_set foi descontinuado em Django 1.2 e foi removido desde Django 1.4, 1.4, o framework de mensagens ) deve ser usado em seu lugar.

from Django.contrib import messages

# messages.add_message(request, level, message, extra_tags='', fail_silently=False)
messages.add_message(request, messages.INFO, "Your Message")

As mensagens podem ser renderizadas no modelo com:

{% 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

Para expandir a resposta útil de Antoine: se você deseja processar as mensagens no seu módulo de visualizações, em vez do modelo:

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