【问题标题】:Django - differences between using request.GET and request.POSTDjango - 使用 request.GET 和 request.POST 的区别
【发布时间】:2026-01-24 01:50:01
【问题描述】:

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

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

【问题讨论】:

    标签: django post get django-forms request


    【解决方案1】:
    1. 没有。 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 的计算结果为''' ',在运行strip() 后,它们都将是Falseif request.GET.has_key('query'): 只检查密钥是否存在,不查看值。

    【讨论】:

    • 好的,谢谢。对于问题 #3,如果我执行了“form = SearchForm(request.GET) if form.is_valid():”,那么我就不必执行“if request.GET.has_key('query'):”了,对吗?因为如果 form.is_valid() 为真,那么这意味着肯定有一个“查询”键,因为这是表单具有的唯一字段,并且 form.is_valid 检查并确保存在“查询”,对吗?根据您的答案#4,如果键 query='' 或 query=' ',即使它等于一个空字符串,它仍然存在,对吗?那么为什么“如果查询:”即使它仍然存在也会评估为假呢?
    • 是的,使用is_valid 已经检查了query 参数是否已给出并且它是一个非空值。但是query = request.GET['query'].strip() 获取值然后删除前导和尾随空格。如果query 只是空格,那么它仍然会评估为False。真的这些检查都应该在表单而不是视图中,