Передать начальное значение в поле формы Django

вопрос новичка Django....

Я пытаюсь написать форму поиска и поддерживать состояние поля ввода между запросом поиска и результатами поиска.

вот моя форма:

class SearchForm(forms.Form):
    q = forms.CharField(label='Search: ', max_length=50)

и вот мой вид код:

def search(request, q=""):
    if (q != ""): 
        q = q.strip()
        form = SearchForm(initial=q) 
        #get results here...
        return render_to_response('things/search_results.html',
          {'things': things,  'form': form, 'query': q})
    elif (request.method == 'POST'): # If the form has been submitted
        form = SearchForm(request.POST) 
        if form.is_valid(): 
          q = form.cleaned_data['q']
          # Process the data in form.cleaned_data
          return HttpResponseRedirect('/things/search/%s/' % q) # Redirect after POST
        else:
          form = SearchForm() 
          return render_to_response('things/search.html', {
            'form': form,
          })
    else:
        form = SearchForm()
        return render_to_response('things/search.html', {
            'form': form,
        })

но это дает мне ошибку:

Caught an exception while rendering: 'unicode' object has no attribute 'get'

как я могу передать начальное значение? Различные вещи, которые я пробовал, похоже, мешают просьбе.Параметр POST.

2 ответов


несколько вещей здесь не приветствуется...

1) рекомендуемая вещь после перенаправления. Это позволяет избежать печально известного всплывающего окна, говорящего, что вы повторно отправляете форму при использовании кнопки "Назад".

2) вам не нужно говорить if request.method == 'POST', просто if request.POST. Это упрощает чтение кода.

3) вид обычно выглядит примерно так:

def myview(request):
    # Some set up operations
    if request.POST:
       form=MyForm(request.POST)
       if form.is_valid():
          # some other operations and model save if any
          # redirect to results page
    form=MyForm()
    #render your form template

это не значит, что не может быть гораздо более простых и гораздо более сложных представлений. Но это суть представления: если запрос-это post-обработка формы и перенаправление; если запрос-get-рендеринг формы.

я не знаю, почему вы получаете ошибку unicode. Я могу только думать, что это связано с одной из ваших моделей, которые вы не предоставляете. Ошибка, как упоминает spookylukey в своем комментарии, скорее всего, вызвана отправкой строки вместо dict в исходный параметр.

Я действительно рекомендую документацию django, в конкретный учебник., но есть также очень хороший Книга Джанго.

все, что сказал, Я думаю, что вы хотите, что-то вроде:

def search(request, q=None):
    if request.POST:
        form = SearchForm(request.POST) 
        if form.is_valid(): 
           q = form.cleaned_data['q']
           url=reverse('search_results', args=(q,))
           return HttpResponseRedirect(url)
    if q is None:
        form = SearchForm() 
    else: 
        form = SearchForm(initial={'q': q})
    return render_to_response('things/search.html', {
        'form': form,
    })

обратите внимание, что параметр initial является диктом значений полей вашей формы.

надеюсь, что это поможет.


формы Django не особенно полезны для вашего варианта использования. Кроме того, для страницы поиска гораздо лучше использовать форму GET и поддерживать состояние в URL-адресе. Следующий код намного короче, проще и гораздо лучше соответствует стандартам HTTP:

def search(request):
    q = request.GET.get('q','').strip()
    results = get_some_results(q)
    render_to_response("things/search.html", {'q': q, 'results': results})

шаблон:

<form method="GET" action=".">
<p><input type="text" value="{{ q }}" /> <input type="submit" value="Search" /></p>
{% if q %}
   {% if results %}
       Your results...
   {% else %}
       No results
   {% endif %}
{% endif %}
</form>