Подтвердить что ты не робот

Как перенаправить в Django с контекстом?

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

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

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

Спасибо.

4b9b3361

Ответ 1

Обратите внимание, что предлагаемый здесь ответ применим только к Django < 1.2:

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

Если ваше единственное требование - отобразить сообщение, тогда есть лучший способ сделать это. Ваше первое представление может создать сообщение для текущего с помощью 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 прочитайте ответ, содержащий сообщения

Ответ 2

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

Ответ 3

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

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