AP2*_*257 8 django django-forms
Django新手问题....
我正在尝试编写搜索表单并维护搜索请求和搜索结果之间的输入框状态.
这是我的表格:
class SearchForm(forms.Form):
q = forms.CharField(label='Search: ', max_length=50)
Run Code Online (Sandbox Code Playgroud)
这是我的观点代码:
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,
})
Run Code Online (Sandbox Code Playgroud)
但这给了我错误:
Caught an exception while rendering: 'unicode' object has no attribute 'get'
Run Code Online (Sandbox Code Playgroud)
我怎样才能传递初始值?我尝试过的各种事情似乎都干扰了request.POST参数.
cet*_*eek 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
Run Code Online (Sandbox Code Playgroud)
这并不是说不可能有更简单和更复杂的观点.但这是一个观点的要点:如果请求是后期处理表单和重定向; 如果请求获得渲染表单.
我不知道你为什么会收到unicode错误.我只能认为它与您未提供的某个型号有关.
像spookylukey提到的错误是在他的评论中,很可能是由于你向初始参数提交字符串而不是dict引起的.
我真的推荐django文档,特别是教程.,但也有非常好的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,
})
Run Code Online (Sandbox Code Playgroud)
请注意,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})
Run Code Online (Sandbox Code Playgroud)
模板:
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12795 次 |
| 最近记录: |