草庐IT

Django学习-武沛齐教程【day1】

麟麟菜菜子 2023-08-25 原文

参考

https://www.bilibili.com/video/BV1NL41157ph

快速上手

创建项目

django-admin startproject 项目名称

默认项目文件介绍

mysite/
-manage.py    【项目的管理、启动项目、创建app、数据管理】【不要动】
-mysite/
  --__init__.py
  --settings.py 【项目配置】【常常操作】
  --urls.py     【URL和函数对应关系】【常常操作】
  --asgi.py     【接收网络请求】【不要动】
  --wsgi.py     【接收网络请求】【不要动】

运行项目:python manage.py runserver

创建APP

python manage.py startapp 应用名称

默认应用文件介绍

mysite/
-app01/
  --__init__.py
  --admin.py    【固定,不用动】django默认提供的admin后台管理
  --apps.py     【固定,不用动】app启动类
  --migrations/ 【固定,不用动】数据库变更记录
    ---__init__.py
  --models.py   【重要】对数据库操作
  --tests.py    【固定,不用动】单元测试
  --views.py    【重要】函数

  1. 注册APP,mysite/setting.py
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config', # 注册APP
]
  1. 编写URL和视图函数对应关系,mysite/urls.py
from app01 import views

urlpatterns = [
    path('index/', views.index),
]
  1. 编写视图函数,app01/views.py
from django.shortcuts import render,HttpResponse

def index(request):
    return HttpResponse("欢迎")

  1. templates模版对应视图函数,app01/templates
def user_list(request):
    # 去app目录下的templates目录寻找user_list.html(根据app的注册顺序,逐一去他们的templates中找)
    return render(request,"user_list.html")
  1. 静态文件,app01/static
{% load static%}
<!DOCTYPE html>
<head>
    <title>Document</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1-dist/css/bootstrap.css' %}">
</head>
<body>
    <script src="{% static 'js/jquery.slim.min.js' %}"></script>
    <script src="{% static 'plugins/bootstrap-3.4.1-dist/js/bootstrap.js' %}"></script>
</body>
</html>

模板语法

  • 代码
# views.py
def tpl(request):
    name = '张三'
    roles = ['管理员', 'CEO', '保安']
    user_info = {"name": 'lisi', "salary": 10000, "role": "CEO"}
    data_list = [
        {"name": 'zhangsan', "salary": 5000, "role": "管理员"},
        {"name": 'lisi', "salary": 6000, "role": "CEO"},
        {"name": 'wangwu', "salary": 7000, "role": "保安"}
    ]
    return render(request, 'tpl.html', {"n1": name, "n2": roles, "n3": user_info, "n4": data_list})


<!DOCTYPE html>
<html lang="en">
  <body>
    <h1>模版语法学习</h1>
    <div>n1为单个元素:{{ n1 }}</div>
    <hr />
    <div>n2为list:{{ n2 }}</div>
    <div>使用.0123代表下标{{ n2[0] }}</div>
    <div>{{ n2[1] }}</div>
    <div>{{ n2[2] }}</div>
    <div>
      {% for item in n2 %}
        <span>list循环展示{{ item }}</span>
      {% endfor %}
    </div>
    <hr />
    <div>n3为字典:{{ n3 }}</div>
    <div>{{ n3.name }}</div>
    <div>{{ n3.salary }}</div>
    <div>{{ n3.role }}</div>
    {% for k, v in n3.items %}
      <div>字典循环{{ k }} = {{ v }}</div>
    {% endfor %}
    <hr />
    <div>n4为列表,元素为字典:{{ n4 }}</div>
    <div>{{ n4[1] }}</div>
    <div>{{ n4[1].name }}</div>
    {% for item in n4 %}
      <div>{{ item.name }}</div>
    {% endfor %}

    {% if n1 == '张三' %}
      <h1>aaaa</h1>
    {% else %}
      <h1>bbbb</h1>
    {% endif %}
  </body>
</html>

视图函数的render内部

  1. 读取含有模版语法的HTML文件
  2. 内部进行渲染(模版语法执行并替换数据),得到只包含HTML标签的字符串
  3. 将渲染完成的字符串返回给用户浏览器

请求和响应

# views.py
def something(request):
    # request是一个对象,封装了用户发送过来的所有请求相关数据
    # 1、【请求】获取请求方式 GET/POST
    print(request.method)
    # 2、【请求】在URL上传递值
    print(request.GET)
    # 3、【请求】通过请求体中提交数据
    print(request.POST)

    # 4、【响应】HttpResponse("返回内容"),字符串内容返回给请求者
    return HttpResponse("返回")

    # 5、【响应】读取HTML的内容+渲染 》》字符串,返回给用户浏览器
    # return render(request,"something.html",{"title":"title"})

    # 6、【响应】让浏览器重定向到其他页面
    # return redirect("https://www.baidu.com")

POST请求错误:CSRF verification failed. Request aborted.

在form表单中加入{% csrf_token %},随机生成的校验机制

<!DOCTYPE html>
<html lang="en">
<body>
    <form action="/login/" method="post">
        {% csrf_token %}
        <input type="text" name="user" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码">
        <input type="submit" value="提交">
    </form>
</body>
</html>
def login(request):
    if request.method== "GET":
        return render(request,"login.html")
    else:
        # <QueryDict: {'csrfmiddlewaretoken': ['49xkDn1H448ehzVqKezwcK3x64Z3Py3d0eq
        #  lBqfIpTIQ6GLtmblEJ8QXza2iMYbf'], 'user': ['zhangsan'], 'pwd': ['123']}>
        print(request.POST)
        return HttpResponse("登录成功")

数据库操作

  • MySQL数据库+pymysql,过于繁琐
import pymysql

# 1.连接MySQL
conn = pymysql.connect(host="127.0.0.1",post=3306,user='root',passwd="root123",charset="utf8",db="unicom")
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
cursor.execute("insert into admin(username,password,mobile) values('zhangsan','123','15000000000')")
conn.commit()
# 3.关闭连接
cursor.close()
conn.close()

Django操作数据库更简单,内部提供了ORM框架,ORM将代码翻译成为sql语句

安装第三方模块

conda install mysqlclient

ORM

ORM可以做两件事:

  1. 创建、修改、删除数据库中的表(不用写SQL语句)【无法创建数据库,自己创建】
  2. 操作表中的数据(不用写SQL语句)

自己创建数据库

  1. 启动Mysql服务

    mysql -u root -p root123456

  2. 创建数据库test

    create database test default charset utf8 collate utf8_general_ci;

Django连接数据库

在mysite/settings.py中进行配置和修改

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test', #数据库的名字
        'HOST': '127.0.0.1', #数据库地址
        'PORT': '3306', #端口
        'USER': 'root', #用户名
        "PASSWORD": 'root123456', #密码
    }
}

django操作表

在app01/models.py中创建、修改、删除表

from django.db import models

class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    password=models.CharField(max_length=64)
    age=models.IntegerField()
    
'''相当于
create table 
app01_userinfo(
    id bigint auto_increment primary key,
    name varchar(32),
    password varchar(64),
    age int
)
'''

命令行执行:

python manage.py makemigrations

python manage.py migrate

注意:

  • APP需要提前在setting.py中注册

  • 在表中新增列时,由于已存在列中可能已有数据,所以新增列必须要指定新增列对应的数据

    1. 设置默认值

      age = models.IntegerField(default=2)

    2. 允许为空

      data = models.IntegerField(null=True,blank=True)

  • 如果在开发中要对表结构进行调整,在models.py中操作类即可,再执行

    python manage.py makemigrations

    python manage.py migrate

操作表中数据

#views.py
from app01.models import Department

def orm(request):
    # 1、新建数据
    Department.objects.create(title="销售部")
    Department.objects.create(title="运营部")
    Department.objects.create(title="IT部")
    
    # 2、删除数据
    Department.objects.filter(id=1).delete() # 删除符合条件的数据
    Department.objects.all().delete() # 删除全部数据
    
    # 3、获取数据
    # data_list=[行对象,行对象,...] QuerySet类型
    data_list=Department.objects.all() # 获取全部数据
    data_list = Department.objects.filter(title="运营部") # 获取所有符合条件的数据
    for obj in data_list:
        print(obj.id,obj.title)
    data = Department.objects.filter(title="运营部").first() # 获取符合条件的第一条数据
    
    # 4、更新数据
    Department.objects.all().update(title="IT部") # 更新所有数据
    Department.objects.filter(id=3).update(title="IT部") # 更新符合条件的数据
    
    return HttpResponse("成功")

案例,用户管理

1、展示用户列表

  • urls.py
urlpatterns = [
    # 案例 用户管理
    path('infolist/',views.infolist),
]
  • views.py
    • 获取所有用户信息
    • HTML渲染
#views.py
from app01.models import Department,UserInfo

def infolist(request):
    # 1、获取数据库中所有的用户信息
    data_list=UserInfo.objects.all()
    # 2、渲染,返回给用户
    return render(request,"infolist.html",{"data_list":data_list})
  • templates/infolist.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>id</th>
                <th>姓名</th>
                <th>密码</th>
                <th>年龄</th>
            </tr>
        </thead>
        <tbody>
            {% for item in data_list %}
                <tr>
                    <td>{{item.id}}</td>
                    <td>{{item.name}}</td>
                    <td>{{item.password}}</td>
                    <td>{{item.age}}</td>
                </tr>
            {% endfor %}
        </tbody>
    </table>
</body>
</html>

2、添加用户

  • urls.py
urlpatterns = [
    # 案例用户管理
    path('infolist/',views.infolist),
    path('infoadd/',views.infoadd),
]
  • views.py
    • GET,看到页面,输入内容
    • POST,写入到数据库
def infoadd(request):
    # GET,看到页面,输入内容
    if request.method=="GET":
        return render(request,"infoadd.html")
    # POST,写入到数据库
    user=request.POST.get("name")
    pwd=request.POST.get("pwd")
    age=request.POST.get("age")

    #添加到数据库
    UserInfo.objects.create(name=user,password=pwd,age=age)
    return redirect("/infolist/")
  • templates/infoadd.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <!--不写action,默认是给当前地址提交post-->
    <form method="post">
        {% csrf_token %}
        <input type="text" name="name" placeholder="用户名">
        <input type="password" name="pwd" placeholder="密码">
        <input type="text" name="age" placeholder="年龄">
        <input type="submit" value="提交">
    </form>
</body>
</html>

3、删除用户

  • urls.py
urlpatterns = [
    # 案例用户管理
    path('infolist/',views.infolist),
    path('infoadd/',views.infoadd),
    path('infodelete/',views.infodelete),
]
  • views.py
def infodelete(request):
    nid=request.GET.get('nid')
    UserInfo.objects.filter(id=nid).delete()
    return redirect('/infolist/')
  • templates/infolist.html
<tbody>
    {% for item in data_list %}
        <tr>
            <td>{{item.id}}</td>
            <td>{{item.name}}</td>
            <td>{{item.password}}</td>
            <td>{{item.age}}</td>
            <td><a href="/infodelete/?nid={{item.id}}">删除</a></td>
        </tr>
    {% endfor %}
</tbody>

有关Django学习-武沛齐教程【day1】的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  4. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  5. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  6. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  7. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  8. ruby - 我如何学习 ruby​​ 的正则表达式? - 2

    如何学习ruby​​的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby​​的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/

  9. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  10. ruby-on-rails - rails : Find tasks that were created on a certain day? - 2

    我有一个任务列表(名称、starts_at),我试图在每日View中显示它们(就像iCal)。deftodays_tasks(day)Task.find(:all,:conditions=>["starts_atbetween?and?",day.beginning,day.ending]end我不知道如何将Time.now(例如“2009-04-1210:00:00”)动态转换为一天的开始(和结束),以便进行比较。 最佳答案 deftodays_tasks(now=Time.now)Task.find(:all,:conditio

随机推荐