Как мне перенаправить в Django с контекстом? - PullRequest
48 голосов
/ 02 сентября 2010

У меня есть представление, которое проверяет и сохраняет форму.После сохранения формы я бы хотел перенаправить обратно в представление list_object с сообщением об успешном завершении «форма для клиента xyz была успешно обновлена ​​...»

HttpResponseRedirect не похоже, что он будет работать, потому что онесть только аргумент для URL, нет способа передать словарь вместе с ним.

Я попытался изменить свою оболочку для object_list, чтобы принимать dict в качестве параметра, имеющего необходимый контекст.Я возвращаю вызов этой обертке из вида, который сохраняет форму.Однако, когда страница отображается, URL-адрес будет «/ customer_form /», а не «/ list_customers /».Я пытался изменить объект запроса, прежде чем передать его в обертку object_list, но это не сработало.

Спасибо.

Ответы [ 3 ]

71 голосов
/ 31 июля 2012

request.user.message_set устарел в Django 1.2 и был удален с Django 1.4, вместо этого следует использовать каркас сообщений .

from django.contrib import messages

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

В этом случае сообщения могут отображаться в шаблонес:

{% if messages %}
    <ul class="messages">
        {% for message in messages %}
            <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
        {% endfor %}
    </ul>
{% endif %}
22 голосов
/ 02 сентября 2010

Обратите внимание, что предложенный ответ применим только к Django <1.2: </strong>

Есть ли у вас контроль над видом, на который вы перенаправляете? В этом случае вы можете сохранить контекст в сеансе перед перенаправлением. Целевое представление может выбрать контекст (и удалить его) из сеанса и использовать его для визуализации шаблона.

Если ваше требование only заключается в отображении сообщения, то есть лучший способ сделать это. Ваш первый просмотр может создать сообщение для текущего, используя auth, а второй просмотр прочитает и удалит его. Примерно так:

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

Сообщения сохраняются в базе данных. Это означает, что вы можете получить к ним доступ даже после перенаправления. Они автоматически читаются и удаляются при рендеринге шаблона. Вам нужно будет использовать RequestContext, чтобы это работало.

Для Django => 1.2 читать ответ с сообщениями

11 голосов
/ 07 января 2016

Чтобы расширить полезный ответ Антуана: если вы хотите обрабатывать сообщения в модуле представлений, а не в шаблоне:

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})
...