我开始学习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)的字段,有没有办法让我获取/访问用户为表单的特定部分输入的内容?假设我想获取名称并查看我的数据库中是否已存在该名称,是否有办法让我这样做?
答案 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)