2

我开始学习 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() 部分,根据我的阅读,request 应该始终是第一个参数,但是有人可以解释一下 request 作为参数的作用以及函数的前两行是什么正在做?else 语句和 else 语句(args 部分)之后到底发生了什么?

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

4

3 回答 3

3

request.POST 除其他外(如 CSRF 令牌值)包含用户在表单中输入的所有数据。

if request.POST

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

form = ArticleForm(request.POST)

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

于 2013-07-28T20:48:53.047 回答
2

我希望您熟悉GET 和 POST 等HTTP 方法。

requestobject 代表任何用户代理的单个请求。因此,它可以是您在浏览特定页面时从浏览器发送的请求,也可以是来自搜索引擎的爬虫发送的请求。在此处阅读有关请求的更多信息

request.POST是这个request对象的一个​​属性,它是一个QueryDict(非常类似于普通的 Python 字典)。它包含发送到视图的 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 })

希望能帮助到你。

于 2013-07-28T20:51:38.653 回答
1

代码中有一些错误,似乎是从 SO 问题中复制粘贴的。我会推荐阅读优秀的 Django 文档,尤其是Django 教程

您的示例应该看起来像Django 文档中的这个示例

以下是一些评论:

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)
于 2013-07-28T20:59:33.233 回答