从我读过的所有HTML书籍中,我知道在更改,添加或删除数据库以及处理敏感信息(如密码)时应使用POST。当您只想搜索数据库而不进行任何更改时,应使用GET。话虽如此,我正在读一本关于Django的书,直到现在,为了处理表格,我们这样做了:
def RegistrationFormView(request):
form = RegistrationForm()
if request.method == "POST": #if the user has clicked the 'submit' button on the form and is sending data
form = RegistrationForm(request.POST)
这是有道理的。本书继续教授如何创建搜索数据库的搜索页面。为此,我们使用GET,这是有道理的。这是形式:
class SearchForm(forms.Form):
query = forms.CharField(
label='Enter a keyword to search for',
widget=forms.TextInput(attrs={'size': 32})
)
但这是观点(这让我很困惑):
def search_page(request):
form = SearchForm()
bookmarks = []
show_results = False #Only show results if the user has searched something
if request.GET.has_key('query'): #check if the user submitted GET data
show_results = True #return results since the user has submitted GET data
query = request.GET['query'].strip()
if query:
form = SearchForm({'query' : query})
我想在这里澄清四件事。
1)如果我做的话,它会完全相同吗
if request.method == "GET":
而不是
if request.GET.has_key('query'):
2)在行
if request.GET.has_key('query'):
根据Djangobook,它说“has_key返回True或False,指定request.GET或request.POST是否具有给定的密钥。”现在,究竟什么是“关键”?键是表单中的字段,
if request.GET.has_key('query'):
检查用户是否填写了名为'query'的formField?
3)当方法是GET时,我是否可以调用form.is_valid()?因为我在想的是
form = SearchForm(request.GET)
if form.is_valid():
query = form.cleaned_data['query']
这是允许的吗?
4)为什么这本书
if query:
之后
query = request.GET['query'].strip()
?不行
if request.GET.has_key('query'):
已经验证“查询”字段已填写?
答案 0 :(得分:3)
没有。 if request.method == "POST":
绝不等同于if request.GET.has_key('query'):
request.GET
和request.POST
是字典子类,has_key
是内置字典接口http://docs.python.org/2/library/stdtypes.html#dict.has_key的一部分但不推荐使用{{1} }}
表单不关心请求方法或根本没有请求。无论来源是什么,表单都会验证字典。
在'query' in request.GET
或?query=
的情况下,密钥?query=%20
会评估为query
和''
,' '
False
在通过strip()
之后。 if request.GET.has_key('query'):
仅检查密钥是否存在且未查看该值。