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)

相关推荐
sdaxue.com1 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)2 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长2 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_2 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui12 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记2 小时前
MHA binlog server
数据库·mysql
lovelin+v175030409663 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
isSamle3 小时前
使用Vue+Django开发的旅游路书应用
前端·vue.js·django
DT辰白4 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存