将初始值传递给Django表单字段

时间:2009-12-10 17:29:15

标签: django django-forms

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'

如何传递初始值?我尝试过的各种事情似乎都干扰了request.POST参数。

2 个答案:

答案 0 :(得分:10)

这里有好几件事......

1)POST后推荐的东西是重定向。这避免了臭名昭着的弹出窗口,表示您在使用后退按钮时重新提交表单。

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

这并不是说没有更简单,更复杂的观点。但这是一个观点的要点:如果请求是后期处理表单和重定向;如果请求获得呈现形式。

我不知道你为什么会收到unicode错误。我只能认为它与您未提供的某个型号有关。 像spookylukey提到的错误是在他的评论中,很可能是由你提交字符串而不是dict到初始参数引起的。

我真的推荐particular the tutorial.中的django文档,但也有非常好的Django Book

所有这一切,我想你想要的东西:

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的参数是表单字段值的字典。

希望有所帮助。

答案 1 :(得分:5)

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>