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>")
posted @ 2021-05-17 18:33  Weisswire  阅读(80)  评论(0编辑  收藏  举报