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

时间:2014-01-20 01:00:37

标签: django post get django-forms request

从我读过的所有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'):

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

1 个答案:

答案 0 :(得分: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的一部分但不推荐使用{{1} }}

  3. 表单不关心请求方法或根本没有请求。无论来源是什么,表单都会验证字典。

  4. 'query' in request.GET?query=的情况下,密钥?query=%20会评估为query''' ' False在通过strip()之后。 if request.GET.has_key('query'):仅检查密钥是否存在且未查看该值。