Django基础学习笔记(四)
在上一篇的末尾介绍了关于Django的视图部分以及请求对象和响应对象的概念。
这里就趁热打铁的介绍一下,网站的经典交互方式:HTML表单。
HTML表单(HTTP请求)
HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。
GET方法
这里的参数就会和html的input标签中name字段相关(之前验证浏览器存储账号和密码时也是根据此字段进行存储的),由于urls.py仅负责进行路由,这里不再分析展示。
对应的表单search_form.html模板(templates)文件如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<form action="/search/" method="get">
<input type="text" name="q">
<!--这里的q被用于GET方法的字段识别-->
<input type="submit" value="搜索">
</form>
</body>
</html>
这里建立一个与views平行的search.py用于处理表单,代码如下所示:
from django.http import HttpResponse
from django.shortcuts import render
# 表单(访问方法search.search_form)
def search_form(request):
return render(request, 'search_form.html')
# 接收请求数据
def search(request):
request.encoding='utf-8'
if 'q' in request.GET and request.GET['q']:
message = '你搜索的内容为: ' + request.GET['q']
else:
message = '你提交了空表单'
return HttpResponse(message)
POST方法
对应的表单post.html模板(templates)文件如下所示:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<form action="/search-post/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="搜索">
</form>
<p>{{ rlt }}</p>
</body>
</html>
具体调用方法以及实现机制同上,建立与views.py平行的search2.py,代码如下所示:
# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.views.decorators import csrf
# 接收POST请求数据
def search_post(request):
ctx ={}
if request.POST:
ctx['rlt'] = request.POST['q']
return render(request, "post.html", ctx)
值得一提的是,要注意一下urls.py中的import部分,进行上述操作后该部分的代码为:
from django.conf.urls import url
from . import views,testdb,search,search2
Request对象
这部分类似于最开始介绍的Hello World,类似的实现代码如下所示:
from django.http import HttpResponse
def runoob(request):
return HttpResponse("Hello world")
QueryDict对象
数据库操作
可以通过Navicat在已连接的数据库中建立数据表,表名要与函数名对应:表名组成结构为:应用名_类名(如:TestModel_test)。
或者使用如下命令创建对应APP模块函数中用到的数据表(即要先在对应APP模块中models.py写好操作数据库的函数代码):
python manage.py migrate # 创建表结构
python manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
python manage.py migrate TestModel # 创建表结构
其中,models.py的代码如下所示:
# models.py
from django.db import models
class Test(models.Model):
name = models.CharField(max_length=20) #自动生成的表将包括除id字段(Key)之外的name字段
添加数据
正如前文连接数据库提到的,之后若想添加数据只需要如下代码,save即添加数据后保存(此部分均需要在urls.py中的import部分加入对应的内容):
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
test1 = Test(name='runoob')
test1.save()
return HttpResponse("<p>数据添加成功!</p>")
获取数据
这部分比较简单粗暴,直接上代码:
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
# 初始化
response = ""
response1 = ""
# 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
list = Test.objects.all()
# filter相当于SQL中的WHERE,可设置条件过滤结果
response2 = Test.objects.filter(id=1)
# 获取单个对象
response3 = Test.objects.get(id=1)
# 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
Test.objects.order_by('name')[0:2]
#数据排序
Test.objects.order_by("id")
# 上面的方法可以连锁使用
Test.objects.filter(name="runoob").order_by("id")
# 输出所有数据
for var in list:
response1 += var.name + " "
response = response1
return HttpResponse("<p>" + response + "</p>")
更新数据
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
# 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
test1 = Test.objects.get(id=1)
test1.name = 'Google'
test1.save()
# 另外一种方式
#Test.objects.filter(id=1).update(name='Google')
# 修改所有的列
# Test.objects.all().update(name='Google')
return HttpResponse("<p>修改成功</p>")
删除数据
# -*- coding: utf-8 -*-
from django.http import HttpResponse
from TestModel.models import Test
# 数据库操作
def testdb(request):
# 删除id=1的数据
test1 = Test.objects.get(id=1)
test1.delete()
# 另外一种方式
# Test.objects.filter(id=1).delete()
# 删除所有数据
# Test.objects.all().delete()
return HttpResponse("<p>删除成功</p>")