Как перенаправить в Django с контекстом?
У меня есть представление, которое проверяет и сохраняет форму. После сохранения формы я хотел бы перенаправить обратно в представление list_object с успешным сообщением "форма для клиента xyz была успешно обновлена ..."
HttpResponseRedirect не похоже, что это сработает, потому что у него есть только аргумент для URL-адреса, без возможности использовать словарь с ним.
Я пробовал модифицировать мою оболочку для object_list, чтобы взять dict в качестве параметра, который имеет необходимый контекст. Я возвращаю вызов этой оболочке изнутри представления, которое сохраняет форму. Однако, когда страница отображается, URL является "/customer_form/", а не "/list_customers/". Я попытался изменить объект запроса, прежде чем передать его в оболочку object_list, но это не сработало.
Спасибо.
Ответы
Ответ 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})