2010-09-02 1 views
42

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

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

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

Спасибо.

+7

Примечание для будущих поисковиков: Обязательно прочтите принятый ответ, поскольку он теперь устарел. –

ответ

19

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

+7

Другой ответ, вероятно, должен быть принят как правильный ответ. Это было устаревшим в django 1.2 и удалено в django 1.4 (как упоминалось в другом ответе). –

57

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

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

Чтобы расширить полезный ответ Антуана: если вы хотите обрабатывать сообщения в модуле 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}) 

 Смежные вопросы

  • Нет связанных вопросов^_^