2014-01-20 21 views
3

从我读过的所有HTML书籍中,我知道在更改,添加或删除数据库以及处理敏感信息(如密码)时应使用POST。当您只想在不做任何更改的情况下搜索数据库时,应该使用GET。随着中说,我正在读一本关于Django和到现在为止,处理的形式,我们这样做是这样的:Django - 使用request.GET和请求之间的差异。POST

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.GET.has_key('query'): 

根据Djangobook做

if request.method == "GET": 

,而不是

if request.GET.has_key('query'): 

2),它说“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'): 

已经验证'查询'字段是否填写?

回答

3
  1. if request.method == "POST":绝不等同于if request.GET.has_key('query'):

  2. request.GETrequest.POST的字典子类和has_key是一部分的内置词典的界面http://docs.python.org/2/library/stdtypes.html#dict.has_key但它有利于'query' in request.GET已经过时了。

  3. 表单不关心请求方法或根本不存在请求。表单验证字典无论源可能是什么。

  4. ?query=?query=%20的情况下,关键query将评估为''' '这将同时为False通过strip()运行后。 if request.GET.has_key('query'):只检查密钥是否存在,并且没有查看该值。

+0

好的谢谢。对于问题#3,如果我做了“form = SearchForm(request.GET) if form.is_valid():”那么我不用做“如果request.GET.has_key('query'):”对不对?因为如果form.is_valid()是真的,那么这意味着那里definetely是一个'查询'键,因为这是窗体唯一的字段和form.is_valid检查,并确保'查询'在那里,对吗?根据你的答案#4,如果关键字query =''或query ='',即使它等于一个空字符串,它仍然存在吗?那么,为什么“如果查询:”评估为假,即使它仍然存在? – user2719875

+1

是的,使用'is_valid'已经检查给出'query'参数并且它是一个非空值。然而,'query = request.GET ['query']。strip()'获得值an,然后删除前导和尾随空格。如果'query'只是空格,那么它仍然会被判断为'False'。真的这些检查应该都是形式而不是视图, –