什么django request.POST做什么以及如何使用它?

时间:2013-07-28 20:34:51

标签: django request

我开始学习django,并开始观看有关如何创建表单的教程,并且我已经看到很多地方创建了这样的表单。

def create(request):
    if request.POST:
        form = ArticleForm(request.POST)
        if form.is_valid:
            form.save()
   else:
       form = ArticleForm()
   args = {}
   args.update(csrf(request))
   args['form'] = form
   return render_to_response('create_article.html', args)

现在,假设我创建了一个名为Article的模型,然后从该模型创建了一个ArticleForm,这里到底发生了什么(在我上面提供的代码中)?我理解if form.is_valid:form.save()部分,根据我读到的,请求应该始终是第一个参数,但有人可以解释作为参数的请求以及函数的前两行是什么在做什么?在else语句和else语句(args部分)之后究竟发生了什么?

编辑:另外,假设Article模型有一个名为name = models.CharField(max_length = 20)的字段,有没有办法让我获取/访问用户为表单的特定部分输入的内容?假设我想获取名称并查看我的数据库中是否已存在该名称,是否有办法让我这样做?

3 个答案:

答案 0 :(得分:3)

request.POST等(包括CSRF令牌值)包含用户在表单中输入的所有数据。

if request.POST

检查用户是否确实验证了表单,否则请求中没有POST数据。

form = ArticleForm(request.POST)

一开始看起来很奇怪,但是当用户验证表单时,会加载相同的页面,但是在django表单中处理POST数据以进行数据验证(比如检查必填字段是否留空等等),以便在表单中显示错误。 如果没有错误(form.is_valid())则视图程序继续。

答案 1 :(得分:2)

我希望您熟悉GET和POST等HTTP methods

request对象表示任何用户代理的单个请求。因此,当您浏览特定页面或来自搜索引擎的爬虫时,它可以是您从浏览器发送的请求。详细了解请求here

request.POST是此request对象的属性,它是QueryDict(非常类似于普通的Python dict)。它包含发送到视图的HTTP POST参数。

简而言之:

def create(request):
    if request.POST:  # check if the request is POST request and it contains any parameter  
        form = ArticleForm(request.POST)  # then pass all those parameters to the form
        if form.is_valid:  # process the form to check if it's valid
            form.save()  # save the data if it's valid
        else:
            form = ArticleForm()  # if not valid data, initialize an new / empty form
    args = {}  # create a dict to pass to the template
    args.update(csrf(request))  # add the CSRF token
    args['form'] = form  # add the 'form' above to the 'args' dict
    return render_to_response('create_article.html', args)  # pass that dict to template

不太确定为什么你有这个例子,通常我会像这样做最后一部分:

def create(request):
    .... your code ....
    else:
        form = ArticleForm()
    return render(request, 'create_article.html', { form: form })

希望它有所帮助。

答案 2 :(得分:1)

代码中存在一些错误,似乎是从SO问题中复制粘贴的。我建议您浏览the excellent Django documentation,尤其是Django tutorial

您的示例应该看起来像this example from the Django docs

以下是一些评论:

def create(request):
    if request.POST:
        form = ArticleForm(request.POST)
        if form.is_valid:
            form.save()
            # after successful POST
            # we want to redirect to a different page here
   else:
       form = ArticleForm()
   args = {}
   # you really don't need the following necessarily
   # just use `{% csrf_token %}` inside the form in your template
   args.update(csrf(request))
   args['form'] = form
   # using just `render` like in the example linked to above is more modern
   return render_to_response('create_article.html', args)