如何使用HTML表单查看过程数据?

时间:2018-08-02 11:48:58

标签: django

我正在看这个例子。 这是search_form.html

<html>
<head>
 <title>Search</title>
</head>
<body>
 <form action="/search/" method="get">
  <input type="text" name="q">
  <input type="submit" value="Search">
 </form>
</body>
<html>

Urls.py

urlpatterns = [
# ...
url(r'^search-form/$', views.search_form),
url(r'^search/$', views.search),
# ...
]

观点

from django.http import HttpResponse
from django.shortcuts import render
from books.models import Book


def search(request):
 if 'q' in request.GET and request.GET['q']:
  q = request.GET['q']
   books = Book.objects.filter(title__icontains=q)
   return render(request, 'search_results.html',{'books':books,'query':q})
 else:
  return HttpResponse('Please submit a search term.')

将GET数据传递到查询字符串中时,

/search/?q=paris

真正发生了什么?

此时HTML表单是绑定的还是未绑定的? 我是Django的新手,如果有人可以解释会很好。

1 个答案:

答案 0 :(得分:1)

表单是浏览器中的一个元素,因此Django完全不了解表单。在<form>标记中指定了在有人单击“提交”按钮(或者以其他方式(例如,通过JavaScript调用)提交表单)时应采取的措施。

当表单“触发”时,它取决于method将要执行的操作。这里的method是GET,这意味着表单的内容包装在URI中(?q=paris部分)。网络浏览器通常会发出一个新的HTTP GET请求,但现在会发出新的URI。

Django将监听请求,并看到查询字符串(?q=paris部分)并将其转换为QueryDictQueryDict是某种字典(一个键可以包含多个多个值),然后它就是request.GET的一部分。 Django将查看URI的其他部分,以确定将请求“路由”到哪个视图(在urls.py文件中指定)。

然后,视图将查询request.GET以获取与'q'键(此处为'paris')匹配的字符串,并执行适当的逻辑。在这种情况下,它将进行数据库查询,并在标题中以Book作为子字符串查找'paris'。然后它将呈现一个HTTP响应(可能模板将呈现查询结果,因此将显示一本书的列表,其中每本书都会显示一些详细信息)。

浏览器因此获得响应,然后将其呈现在用户的屏幕上,因此响应中的HTML随后被转换为可视页面。可能会导致额外的查询(例如,如果页面包含<img>标记,则将提取相应的图像)。

method中的<form>也可以是POST(某些浏览器甚至支持其他方法)。在这种情况下,会发出HTTP POST请求,然后将表单中的数据编码在HTTP请求的标头中(因此在URI中可见),如果将其用于示例包含敏感信息)。在那种情况下,视图可以查询request.POST(也是QueryDict)来获取参数。

不管表单的细节如何,其思想都是浏览器发出请求,并且除非“旧”网页的信息存储在某个表单元素或标头中,否则Django无法“查看”页面的状态是什么。实际上,没有必要在特定页面上进行请求。例如,您可能立即请求了your.site.com/?q=paris