我试图更好地理解以下代码。它有效,但我不完全理解几个要素(下面的问题):
from django.shortcuts import render_to_response
from mywiki.wiki.models import Page
from django.http import HttpResponseRedirect
from django import forms
import markdown
class SearchForm(forms.Form):
text = forms.CharField(label='Enter search term')
def search_page(request):
if request.method =='POST':
f = SearchForm(request.POST)
if not f.is_valid():
return render_to_response('search.html', {'form':f})
else:
pages = Page.objects.filter(name__contains = f.cleaned_data['text'])
return render_to_response('search.html', {'form':f, 'pages':pages})
f = SearchForm()
return render_to_response('search.html', {'form':f})
specialPages = {'SearchPage':search_page}
def view_page(request, page_name):
if page_name in specialPages:
return specialPages[page_name](request)
try:
page = Page.objects.get(pk=page_name)
except Page.DoesNotExist:
return render_to_response('create.html', {'page_name':page_name})
content = page.content
return render_to_response('view.html', {'page_name':page_name, 'content':markdown.markdown(content)})
为什么我们需要指定request.method
必须POST
- 不会点击HTML按钮隐含地表示改变/影响某些内容的意图?或者POST
仅在操作影响数据库时才适用?
行pages = Page.objects.filter(name__contains = f.cleaned_data['text'])
如何运作?它需要模型Page(models.Model)
,但在这种情况下'对象'和'过滤'方法有什么作用?
在view_page
中,为什么我们需要在(request)
return specialPages[page_name](request)
醇>
谢谢!
答案 0 :(得分:1)
POST
测试用作区分因素。
使用GET
调用视图时,将呈现表单。表单指定需要使用POST
提交,因此代码假定POST
请求表示表单已提交。
objects
属性会触发实际的数据库查询。通过添加.filter()
调用,您可以指定更具体的数据库查询,其中name
属性包含值f.cleaned_data['text']
。结果是一组与该查询匹配的数据库结果。
specialPages
字典值本身就是视图,要使这些值有效,可以使用request
参数调用它们。就像view_page
视图可调用本身一样。