form.is_valid() возвращает ложь

У меня есть класс модели.

class Search(forms.Form):
    query=forms.CharField()

И функция просмотра.

def search(request):
  c = {}
  c.update(csrf(request))
  if request.method == 'POST': 
    form = Search(request.POST) 
      if form.is_valid():
        search_query=form.cleaned_data['query']
            return HttpResponse("your query: %s" %search_query  , c) 
      else:
        return HttpResponse(form , c)
  else:
    return render_to_response('polls/search.html', c)

И вот мой search.html:

 <form action="/polls/search" method="post">{% csrf_token %}
  <p><label for="query_label">query:</label>
    <input type="text" name="query_txt" id="query_txt_id" /></p>
  <input type="submit" value="Submit" />
 </form>

После ввода некоторых символов в качестве ввода он всегда показывает мне следующее как обычный текст (не как ошибку).

"Произошла ошибка сервера. Пожалуйста, свяжитесь с администратором."


person user1802771    schedule 06.11.2012    source источник


Ответы (1)


id вашего поля запроса неверно. Джанго ожидает, что это будет id_query.

Вам не нужно жестко кодировать входные данные формы. Если вы включите {{ form.as_p }} в свой шаблон, Django отображает форму правильно.

<form action="/polls/search" method="post">{% csrf_token %}
  {{ form.as_p }}
  <input type="submit" value="Submit" />
</form>

Если вы действительно хотите жестко запрограммировать форму в шаблоне, начните с рабочего HTML-кода, созданного Django, и настройте его оттуда. Обратите внимание, что формы в вашем шаблоне и приведенный ниже фрагмент не отображают ошибки. См. документы по настройке шаблона формы. для более подробной информации.

<form action="/polls/search" method="post">{% csrf_token %}
  <p><label for="id_query">Query:</label> <input type="text" name="query" id="id_query" /></p>
  <input type="submit" value="Submit" />
</form>
person Alasdair    schedule 06.11.2012
comment
Большое спасибо. Но если я напишу только это в поле шаблона, это просто создаст кнопку. Нет текстового поля. ‹form action=/polls/search method=post›{% csrf_token %} {{ form.as_p }} ‹input type=submit value=Submit /› ‹/form› - person user1802771; 06.11.2012
comment
Ах, вам нужно добавить форму в контекст вашего шаблона. В ветке else (для запроса на получение) создайте несвязанную форму с помощью form = Search(), затем добавьте ее в контекст шаблона с помощью c.update(form=form). - person Alasdair; 06.11.2012