Django简介

Django

1.安装Django

python 复制代码
pip install django

python的包的分布

python 复制代码
\python
	- python.exe
  - Scripts
  	- pip.exe
    - django-admin.exe  [工具,创建django项目]
  - Lib
  	- 内置模块
    - site-packages 		[安装的包]
    	- pymysql
      - flask
      - django 					[框架的源码]

2.创建项目

Django项目会有一些默认的文件和默认文件夹

2.1 终端

  • 进入终端

  • 进入某个目录(Django项目存放位置)

    cmd 复制代码
    >>> D:
    >>> cd/PycharmProjects
    >>> dir
    >>> cd ..
  • 执行命令创建项目

    cmd 复制代码
    "D:\python\Scripts\django-admin.exe" startproject 项目名称
    #已加入环境变量
    django-admin startproject 项目名称

2.2 Pycharm

直接创建Django项目就好

Python 复制代码
#settings.py里面的
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / 'templates']#相较于终端建立,多了这句,会优先在根目录的templates找模板,然后再去app目录下的templates找
        ,
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

默认项目的文件介绍

复制代码
├─manage.py 		[项目的管理,启动项目、创建app、数据管理,不用修改]
│
├─mysite
│      __init__.py
│      settings.py		【项目配置文件】
│      urls.py				【URL和函数的对应关系】【需要写】
│      asgi.py				【接收网络请求】【不要动】
│      wsgi.py				【接收网络请求】【不要动】
│
└─templates

3. APP

复制代码
- 项目
	- app,用户管理	【表结构、函数、HTML、CSS模板】
	- app,订单管理	【表结构、函数、HTML、CSS模板】
	- app,后台管理	【表结构、函数、HTML、CSS模板】
	- app,网站		 【表结构、函数、HTML、CSS模板】
	- app,API			 【表结构、函数、HTML、CSS模板】
	..

python终端中创建app:

cmd 复制代码
python manage.py startapp  APP名称
复制代码
├─app01
│  │  admin.py					【固定,不用动】 dajango默认提供了admin后台管理
│  │  apps.py						【固定,不用动】app启动类
│  │  models.py					【**重要**】,对数据库操作
│  │  tests.py					【固定,不用动】单元测试
│  │  views.py					【**重要**】视图函数
│  │  __init__.py
│  │
│  └─migrations					【固定,不用动】数据库迁移记录
│          __init__.py

4.启动Django

  • 确保app已注册

    python 复制代码
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config' #setting中注册app,在创建的app的apps.py中找到name和Config
    ]
  • 编写URL和视图函数对应关系 (urls.py)

    python 复制代码
    from django.contrib import admin
    from django.urls import path
    
    from app01 import views
    urlpatterns = [
        #path('admin/', admin.site.urls),
        
        #www.xxx.com/index/ --> 执行函数
        path('index/', views.index),            #在app01的views.py中找index函数
    ]
  • 编写视图函数(view.py)

    python 复制代码
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    
    def index(request): #必须带一个request参数
        return HttpResponse("Hello, world. You're at the index")
  • 启动Django项目

    • 命令行启动

      python 复制代码
      python manage.py runserver
    • Pycharm

      启动Django项目即可,注意默认的端口是8000,而酷狗音乐喜欢占用8000,需要关闭

4.1 templates模板

python 复制代码
def user_list(request):
    #去app目录下的templates目录寻找哦user_list.html (根据app的注册顺序,逐一去它们的 templates找),render是重定向的意思,定向到这个网页
    return render(request, "user_list.html")

4.2 静态文件

开发过程中一般将:

  • 图片
  • CSS
  • js

都会当作静态文件处理,需要放在对应app目录下的static文件夹内

复制代码
static
	- css
	- js
	- img
	- plugins

引用static文件:

html 复制代码
{% load static %}
<!--传入static的路径-->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}"
</head>
<body>
    <h1>用户列表</h1>


<script src="{% static 'js/jquery-3.7.1.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.js' %}"></script>
</body>
</html>

5.Django模板的语法

python 复制代码
def tpl(request):
    name = "Zeus"
    roles=["top","jungle","mid","ad","sup"]
    player_info={"name":"Jackeylove","role":"ad","age":"25"}
    data_list=[
        {"name": "Jackeylove", "role": "ad", "age": "25"},
        {"name": "369", "role": "top", "age": "25"},
        {"name": "Meiko", "role": "sup", "age": "25"}
    ]
    return render(request, 'tpl.html', {"n1":name,"n2":roles,"n3":player_info,"n4":data_list})
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Django模板语法学习</h1>
    <div>{{ n1 }}</div>
    <div>{{ n2 }}</div><!--获取单个元素,可以是列表-->
    <div>{{ n2.0 }}</div>
    <div>{{ n2.1 }}</div>
    <div>{{ n2.2 }}</div><!--获取列表中的单个元素,使用.-->
<div>
    <!--for 循环-->
    {% for item in n2 %}
        <span>{{ item }}</span>
    {% endfor %}
</div>
<hr/>
<!--字典元素-->
{{ n3 }}
{{ n3.name }} <!--根据key获得单个value-->
{{ n3.salary }}
{{ n3.role }}
    <ul>
        {%  for item in n3.keys %}<!--for循环获取键-->
            <li>{{ item }}</li>
        {% endfor %}
        {%  for item in n3.values %}<!--for循环获取值-->
            <li>{{ item }}</li>
        {% endfor %}
        {%  for item in n3.items %}<!--for循环获取键值-->
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
<!--列表里面嵌套字典(通过.来获取)-->
{{ n4.1.name }}
{{ n4.1.role }}

{% for item in n4 %}
    <div>{{ item.name }} {{ item.roles }}</div>
{% endfor %}
<hr/>
<!--条件语句-->
{% if n1 == "Zeus" %}
    <h1>世一上</h1>
{% elif n1 == "The Shy" %}
    <h1>断手</h1>
{% else %}
    <h1>?</h1>
{% endif %}
</body>
</html>

总结

  1. 获取单个值(可以是列表,可以是字典):

    html 复制代码
     {{ [传入名称] }}
  2. 获取列表中的单个值

    html 复制代码
    {{ [传入名称].i}}
  3. 字典元素

    对于单个字典元素,有key,value,item三个属性,对于字典,有keys,values,items三个属性

  4. for循环

    html 复制代码
    {% for item in [遍历的列表或字典] %}
    	<!--html样式,在这里会重复列表或字典的长度次数-->
    {% endfor%}
  5. 条件语句

    html 复制代码
    {% if (p)%}
    	<!--html样式-->
    {% elif (p1) %}
    	<!--html样式-->
    ...
    {% else %}
    	<!--html样式-->
    {% endfor %}

6.请求和响应

python 复制代码
def something(request):
    #request是一个对象,封装了用户通过浏览器发送过来的所有数据

    #1.获取请求方式
    print(request.method)

    #2.在URL上传递的值,用GET可以得到
    print(request.GET)

    #3.在请求体中提交的数据
    print(request.POST)


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

    #5.读取html的内容,加上渲染,生成新的字符串,返回给用户浏览器
    #return render(request,'something.html',{"title":"来了"})

    #6.重定向到其他页面
    return redirect("http://www.bilibili.com")

​ redirec方法是Django收到重定向后,将网址返回给请求者,由请求者自己转移到对应网址。

案例 用户登录

在以POST方式返回用户名和密码时,遇到这种情况:

此时需要在用户登录的form表单中,加入{% csrf_token %}

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登陆</title>
    <link rel="stylesheet" href="../static/css/log_in_green.css"/>
</head>
<body>
<h1>用户登录</h1>
<form method="post" action="/login/">
    
    {% csrf_token %}
    
    <input type="text" name ="user" placeholder="用户名"/>
    <input type="password" name="user" placeholder="密码"/>
    <input type="submit" value="提交"/>

</form>
</body>
</html>

7.Django连接数据库

1.创建数据库

  • 启动数据库
  • 自带工具创建数据库
sql 复制代码
create database library DEFAULT CHARSET utf8 COLLATE utf8_general_ci

2.django连接数据库

​ 在settings.py文件中进行配置和修改

在setteings对DATABASES进行更改:

python 复制代码
DATABASES={
    'default':{
        'ENGINE':'django.db.backends.mysql',#表示可连接mysql,可将mysql改为sqlite3,
        'NAME':'library',#写想连接的数据库的名字
        'USER':'root',#用户名
        'PASSWORD':horse030811,#密码
        'HOST':'127.0.0.1',#MySQL是哪台机器
        'PORT':3306,#端口
    }
}

3.django操作表

  • 创建表
  • 删除表
  • 修改表

在models.py文件中,通过定义类来完成表的创建:

python 复制代码
class StudentInfo(models.Model):#必须继承models.Model的内容
    user_id = models.CharField(max_length=20)#登录用的id
    name =models.CharField(max_length=32)#名字
    password = models.CharField(max_length=64) #登录密码
    age = models.IntegerField()#年龄
    gender = models.IntegerField()#性别,男是0,女是1,或者更多,但应该不多于2^32
    major = models.CharField(max_length = 20)#专业
    email = models.CharField(max_length=32)#邮箱,找回密码时可用
    grade = models.CharField(max_length=10) #年级

    #上述代码将由orm翻译为对应sql语句
    
    
create table app01_studentinfo(#表的名称是 app名称+ _ + calss类的小写
    id bigint auto_increment primary key #orm创建的每个表都会自动创建一个递增的主键id
    name varchar(32),
    password varchar(64),
    age int
    ...
)
models的类型
  1. AutoField

    一个自增的IntegerField,想要自定义主键,那么需要填上primary_key,一般不用,django会自动地为每一张表添加自增主键。

    python 复制代码
     uid = models.AutoField(primary_key = True)
  2. CharField

    用来存储字符串(必须指定长度,且小于254个字符)

    python 复制代码
    name = models.CharField(max_length=20,default='xxx') #max_length必须指定
  3. DateField

    保存日期,记录年月日,在数据库中也是date类型,有如下几个参数:

    auto_now =True:每次保存对象时,自动设置该字段为当前时间(可用于修改字段)

    auto_now_add = True:对象第一次被创建时自动设置当前地时间,自动保存的时间的时区使用的时默认时区(可用于创建字段)

    python 复制代码
    test_edit_time = models.DateField(auto_now = True)
    test_create_time = models.DateField(auto_now_add=True)
  4. DateTimeField

    相较于DateField,这个更常用,可保存日期和时间,也有类似的参数

    python 复制代码
    test_edit_time = models.DateTimeField(auto_now = True)
    test_create_time = models.DateTimeField(auto_now_add=True)
  5. TextField

    用于存储大字符串(大于254个字符),是数据库中的longtext类型

  6. IntegerField

    整型,32位bits,还有BigIntegerField,从 − 2 63 到 2 63 − 1 -2^{63}到2^{63}-1 −263到263−1。

  7. BinaryField

    存储二进制的字段,只支持bytes赋值

  8. BooleanField

    存储True或False,在数据库中是tinyint类型,若没指定默认值,则位None。如果可能为null,则需要将类型设置为NullBooleanField

  9. FloatField

    浮点数,即float

  10. UUIDField

    用来存储UUID的字段,使用的是python的UUID类

写好model后,表还没被创建,还需要在终端执行命令(app需要提前注册):

python 复制代码
python manage.py makemigrations
python manage.py migrate#需要mysqlclient包

就可以生成表了,表时INSTALLED_APPS(settings.py)中注册的app(包含默认的表)

修改表
复制代码
一个已经生成的表,如果在models里面删去了某个值,那么再makemigrations和migrate后,表中对应的列将会消失。

​ 如果在models中增加了一个值(即增加了一列),就产生了一个问题,表中原有的元组中的新属性的值是什么?此时映射后,终端会提示你做出选择:

  1. Provide a ont-off default now(will be set on all existing rows with a null value for this column)
  2. Quit,and let me add a default in models.py

输入1和2进行选择

输入1,则需要输入一个希望的默认值。

输入2,则直接退出,提示在models里设定好默认值(default=xx)

相关推荐
Elastic 中国社区官方博客5 小时前
在 Elasticsearch 中使用 Mistral Chat completions 进行上下文工程
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
编程爱好者熊浪6 小时前
两次连接池泄露的BUG
java·数据库
TDengine (老段)8 小时前
TDengine 字符串函数 CHAR 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据
qq7422349848 小时前
Python操作数据库之pyodbc
开发语言·数据库·python
姚远Oracle ACE8 小时前
Oracle 如何计算 AWR 报告中的 Sessions 数量
数据库·oracle
Dxy12393102169 小时前
MySQL的SUBSTRING函数详解与应用
数据库·mysql
码力引擎9 小时前
【零基础学MySQL】第十二章:DCL详解
数据库·mysql·1024程序员节
杨云龙UP9 小时前
【MySQL迁移】MySQL数据库迁移实战(利用mysqldump从Windows 5.7迁至Linux 8.0)
linux·运维·数据库·mysql·mssql
l1t9 小时前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
安当加密9 小时前
Nacos配置安全治理:把数据库密码从YAML里请出去
数据库·安全