Django-使用request.GET和request.POST之间的区别

use*_*875 5 django post get request django-forms

从我阅读过的所有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)
Run Code Online (Sandbox Code Playgroud)

这是有道理的。本书继续讲授如何创建一个搜索页面,以搜索数据库。为此,我们使用GET,这很有意义。形式如下:

class SearchForm(forms.Form):
    query = forms.CharField(
    label='Enter a keyword to search for',
    widget=forms.TextInput(attrs={'size': 32})
)
Run Code Online (Sandbox Code Playgroud)

但这是视图(这就是使我困惑的地方):

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})
Run Code Online (Sandbox Code Playgroud)

我想在这里澄清四件事。

1)如果我刚做的话会完全一样吗

if request.method == "GET":
Run Code Online (Sandbox Code Playgroud)

代替

 if request.GET.has_key('query'):
Run Code Online (Sandbox Code Playgroud)

2)在行

if request.GET.has_key('query'):
Run Code Online (Sandbox Code Playgroud)

根据Django的书,它说:“ has_key返回True或False,指定request.GET或request.POST是否具有给定密钥。” 现在,什么是“钥匙”?键是表单中的字段,并且

if request.GET.has_key('query'):
Run Code Online (Sandbox Code Playgroud)

检查用户是否已填写被称为“查询”的formField?

3)方法为GET时,我可以调用form.is_valid()吗?因为我当时在想

form = SearchForm(request.GET)
if form.is_valid():
    query = form.cleaned_data['query']
Run Code Online (Sandbox Code Playgroud)

可以吗

4)这本书为什么要做

if query:
Run Code Online (Sandbox Code Playgroud)

query = request.GET['query'].strip() 
Run Code Online (Sandbox Code Playgroud)

?不行

if request.GET.has_key('query'):
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*vin 5

  1. No.if request.method == "GET":绝不等同于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将评估为''' 'which 都将False在运行后strip()if request.GET.has_key('query'):只检查键是否存在而不查看值。