2013-11-07 6 views
1

Im писать простое приложение, где я могу собрать некоторую информацию из формы и отобразить его на тот же шаблон ..Доступ к переменному запросу в шаблоне

Ниже приведен код,

Когда я пытаюсь получить доступ - {{request.POST['fname']}} - из шаблона, я получаю следующее сообщение об ошибке,

Could not parse the remainder: '['fname']' from 'request.POST['fname']' 

Как получить доступ к переменной запроса в шаблоне?

views.py 

    def test_page(request): 
     print 'request.method =', request.method 
     if request.method == 'POST': 
      print 'request.post = ', request.POST['fname'] 
      variables = RequestContext(request,{'display_form':False}) 
      return render_to_response('test_page.html',variables) 
     else: 
      variables = RequestContext(request,{'display_form':True}) 
      return render_to_response('test_page.html',variables) 

template 

    <html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> 
    <title>Test Page</title> 
    </head> 
    <body> 
    This is a test page 
    {% if display_form %} 
     <form action="." method="post">{% csrf_token %} 
      FIRST NAME : <input type="text" name="fname"> 
      <input type="submit" value="register"/> 
     </form> 
    {% else %} 
     {{request.POST['fname']}} 
    {% endif %} 

    </body> 
    </html> 

ответ

1

Плохая идея получить запрос.POST явно в шаблоне. Обработка запроса. POST - это больше бизнес-логики, поэтому контроллер/представление должны ее обрабатывать.

Здесь находится оптимизированный код. Есть меньше дублирования кода, и это более понятно. fname - None, если имя не указано. Также лучше использовать Django Form или ModelForm класс для обработки форм. Пожалуйста, проверьте его здесь: https://docs.djangoproject.com/en/dev/topics/forms/

Вы также должны использовать UTF-8 вместо charset=ISO-8859-1" to have less problems with unicode characters later. HTTP-эквив is a little bit outdated (it's used for HTML 4.01), use мета charset` вместо этого.

вид:

def test_page(request): 

    if request.method == 'POST': 
     fname = request.POST.get('fname') 
     display_form = False 
    else: 
     fname = None 
     display_form = True 

    variables = RequestContext(request,{'display_form': display_form, 'fname': fname}) 
    return render_to_response('test_page.html', variables) 

шаблон:

<html> 
<head> 
<meta charset="UTF-8"> 
<title>Test Page</title> 
</head> 
<body> 
This is a test page 
{% if display_form %} 
    <form action="." method="post">{% csrf_token %} 
     FIRST NAME : <input type="text" name="fname"> 
     <input type="submit" value="register"/> 
    </form> 
{% else %} 
    {{ fname }} 
{% endif %} 

</body> 
</html> 
+0

спасибо большое за разъяснение. – user1050619

+0

В оптимизированном решении вам необходимо внедрить передовые методы и выпустить перенаправление. –

+0

Вы правы, но тема стартера не давала никаких оснований, почему он хочет иметь такую ​​форму. Итак, где это должно быть перенаправлено по вашему мнению? – nickzam

1

Правильный способ доступа к словарю значение в шаблоне является: {{ request.POST.fname }}

1

Вы можете написать:

{{ request.POST.fname }} 

Это будет выполнять поиск по fname в request.POST.

Джанго поддерживают:

  • словарных запросы (foo['bar'])
  • атрибутов запросов (foo.bar)
  • список поисков (foo[bar])

всякий раз, когда вы пишете foo.bar (см Variables and lookups в документации).

0

Прежде всего, вы должны проиндексировать его через request.POST.fname. Это словарь как объект, а также он всегда возвращает строки, только FYI.

Во-вторых, после обращения с запросом POST вы всегда должны вызывать перенаправление (HttpResponseRedirect), а не нормальный render. Это предотвратит передачу данных дважды, если пользователь нажмет кнопку «Назад».

Это наилучшая практика и всегда должна быть выполнена.

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