Django的基础操作以及快速上手

目录

一、安装Django

 二、创建项目

1、终端操作

 2、默认项目的文件

三、创建APP

 四、快速上手

1、页面编写

 2、templates模板

 3、静态文件

4、模板语法

五、请求和响应

案例:用户登录

六、数据库操作

1、安装第三方模块

 2、ORM

Django操作表

Django操作表数据

七、案例:用户列表

1、展示用户列表

2、用户添加

3、用户删除


 Python知识点:函数、面向对象。
 前端开发:HTML、CSS、JavaScript、jQuery、BootStrap。
 MySQL数据库。
 Python的Web框架:
   Flask,自身短小精悍 + 第三方组件。
   Django,内部已集成了很多组件 +  第三方组件。【主要】

一、安装Django

pip install django


    - python.exe
    - Scripts
        - pip.exe
        - django-admin.exe   【工具,创建django项目中的文件和文件夹】
    - Lib
        - 内置模块
        - site-packages
            - openpyxl
            - python-docx
            - flask
            - django         【框架的源码】
 

 二、创建项目

django中项目会有一些默认的文件和默认的文件夹。

1、终端操作

  • 打开终端。
  • 进入某个目录(项目放在哪里)。

C:\Users\Administrator>d:

D:\>cd Django

  •  执行命令创建项目

django-admin startproject 文件夹名称

 2、默认项目的文件

默认项目的目录介绍:
mysite
├── manage.py        【项目的管理,启动项目、创建app、数据管理】【***常常用***】
└── mysite
    ├── __init__.py
    ├── settings.py    【项目配置】          【***常常修改***】
    ├── urls.py           【URL和函数的对应关系】【***常常修改***】
    ├── asgi.py          【接收网络请求】【不要动】
    └── wsgi.py         【接收网络请求】【不要动】
 

三、创建APP

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

注意:我们开发比较简洁,用不到多app,一般情况下,项目下创建1个app即可。

 创建APP命令,打开终端

python manage.py startapp app01

得到的app和项目目录

├── app01
│   ├── __init__.py
│   ├── admin.py         【固定,不用动】django默认提供了admin后台管理。
│   ├── apps.py          【固定,不用动】app启动类
│   ├── migrations       【固定,不用动】数据库变更记录
│   │   └── __init__.py
│   ├── models.py        【**重要**】,对数据库操作。
│   ├── tests.py         【固定,不用动】单元测试
│   └── views.py         【**重要**】,函数。
├── manage.py

└── mysite2
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py          【URL->函数】
    └── wsgi.py

 四、快速上手

1、页面编写

  • 确保APP已经注册【setting.py】

  •  编写URL和视图函数对应关系 【urls.py】

  •  编写视图函数

  •  启动Django

命令行启动

python manage.py runserver

 Pycharm启动

  •  后续写页面的时候

 2、templates模板

 3、静态文件

在开发过程中一般将:

图片
CSS
js

都会当做静态文件处理。

  • app目录下创建static文件夹

  • 通过load static来引入文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    {% load static %}
    <title>Title</title>
    <link rel="stylesheet" href="{% static 'plugins/bootstrap-3.3.7-dist/css/bootstrap.css' %}">
</head>
<body>
<h1>用户列表</h1>
<img src="{%static 'img/1.jpg' %}" alt="11">

<script src="{% static 'js/jQuery.js'%}"></script>
<script src="{% static 'plugins/bootstrap-3.3.7-dist/js/bootstrap.js' %}"></script>
</body>
</html>

4、模板语法

本质上:在HTML中写一些占位符,由数据对这些占位符进行替换和处理。

py函数

def tpl(request):
    name = "韩超"
    roles = ["管理员", "CEO", "保安"]
    user_info = {"name": "郭志", "salary": 10000, 'role': "CEO"}

    data_list = [
        {"name": "1", "salary": 10000, 'role': "CEO"},
        {"name": "2", "salary": 10000, 'role': "CEO"},
        {"name": "3", "salary": 10000, 'role': "CEO"},
    ]
    return render(request, "tpl.html", {"n1": name, "n2": roles, "n3": user_info,"n4":data_list})

html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>模板语法的学习</h1>
<div>{{ n1 }}</div>
<div>{{ n2 }}</div>
<div>{{ n2.0 }}</div>
<div>{{ n2.1 }}</div>
<div>{{ n2.2 }}</div>
<div>
    {% for item in n2 %}
        <span>{{ item }}</span>
    {% endfor %}
</div>
<hr/>
{{ n3.name }}
{{ n3.salary }}
{{ n3.role }}
{{ n3 }}
<ul>
    {% for item in n3.keys %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
<ul>
    {% for item in n3.values %}
        <li>{{ item }}</li>
    {% endfor %}
</ul>
<ul>
    {% for k,v in n3.items %}
        <li>{{ k }} = {{ v }}</li>
    {% endfor %}
</ul>
<hr/>
{{ n4.0 }}
{{ n4.0.name }}
{% for item in n4 %}
    <div>{{ item.name }} {{ item.salary }} {{ item.role }}</div>
{% endfor %}

<hr/>
{% if n1 == "韩超" %}
    <h1>dadadadada</h1>
{% elif n1 == "xxx" %}
    <h1>dididididi</h1>
{% else %}
    <h1>dududududu</h1>
{% endif %}
</body>
</html>

五、请求和响应

重定向: 浏览器向某个网站发送请求,网站返回给浏览器一个新的URL,浏览器去访问这个新的URL地址
修改views.py, 根据情况去掉下面代码的注释进行测试

def something(request):
    # request是一个对象,封装了用户通过浏览器发送过来的所有请求相关数据
    # 1.获取请求方式
    print(request.method)

    # 2.在url上面传递值
    print(request.GET)

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

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

    # 【响应】5.读取HTML的内容+渲染(替换)->字符串
    return render(request, 'something.html', {"title": "来了"})

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

案例:用户登录

修改views.py

def login(request):
    if request.method == "GET":
        return render(request, "login.html")
    else:
    # 如果是 POST 请求,获取用户提交的数据
    print(request.POST)
    username = request.POST.get("user")
    password = request.POST.get("password")
    if username == "patrick" and password == "666":
        #return HttpResponse("登录成功") 
        return redirect("www.baidu.com")
    else:
        #return HttpResponse("登录失败")
        return render(request, "login.html", {"error_msg": "用户名或密码错误"})

修改url.py文件

from django.contrib import admin
from django.urls import path
from blog import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('index_app/', views.index_app),
    path('user_list/', views.user_list),
    path('tpl/', views.tpl),
    path('something/', views.something),
    path('login/', views.login),
]

 login.html

{% csrf_token %} 必须加上

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>用户登录</h1>
    <form method="post" action="/login/">

        {% csrf_token %}

        <input type="text" name="user", placeholder="用户名">
        <input type="password" name="password", placeholder="密码">
        <input type="submit" value="提交"> 
        <span style="color: red;">{{ error_msg }}</span>
    </form>
</body>
</html>

如果不加 {% csrf_token %} 会出现forbidden(403)错误

六、数据库操作

  • MySQL数据库 + pymysql
  import pymysql
  
  # 1.连接MySQL
  conn = pymysql.connect(host="127.0.0.1", port=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('wupeiqi','qwe123','15155555555')")
  conn.commit()
  
  # 3.关闭
  cursor.close()
  conn.close()
  • Django开发操作数据库更简单,内部提供了ORM框架。

1、安装第三方模块

pip install mysqlclient

 2、ORM

ORM可以帮助我们做两件事:

  • 创建、修改、删除数据库中的表(不用你写SQL语句)。 【无法创建数据库】
  • 操作表中的数据(不用写SQL语句)。

创建数据库:

create database gx_day15 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

修改setting.py 

 

 增加内容:

DATABASES = {
    'default':{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'gx_day15',
        'USER':'root',
        'PASSWORD':'123123',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }
}

Django操作表

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

创建表:在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 your models here.

"""
create table app01_userinfo(
     id bigint auto_increment primary key ,
     name varchar (32),
     password varchar (64),
     age int 
)
"""

执行命令:(app需要提前注册)

python manage.py makemigrations
python manage.py migrate


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

  •  手动输入一个值。
  •  设置默认值

age = models.IntegerField(default=2)

允许为空

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

以后在开发中如果想要对表结构进行调整:

  •  在models.py文件中操作类即可。
  •  命令

  python3.9 manage.py makemigrations
  python3.9 manage.py migrate

 Django操作表数据

新增数据

def orm(request):
    Department.objects.create(title="销售部")
    Department.objects.create(title="IT部")
    Department.objects.create(title="运营部")
    UserInfo.objects.create(name="武沛齐", password="123", age=19)
    UserInfo.objects.create(name="朱虎飞", password="666", age=29)

    return HttpResponse("成功")

删除数据

    Department.objects.all().delete()
    UserInfo.objects.filter(id=2).delete()

获得数据

data_list = UserInfo.objects.all()
print(data_list)
for obj in data_list:
    print(obj.id, obj.name, obj.password, obj.age)
data_list = [对象,]
data_list = UserInfo.objects.filter(id=1)
print(data_list)

获取第一条数据【对象】

row_obj = UserInfo.objects.filter(id=1).first()
print(row_obj.id, row_obj.name, row_obj.password, row_obj.age)

更新数据

# #### 4.更新数据 ####
UserInfo.objects.all().update(password=999)
UserInfo.objects.filter(id=2).update(age=999)
UserInfo.objects.filter(name="朱虎飞").update(age=999)

七、案例:用户列表

1、展示用户列表

URL

函数(获取用户信息、HTML渲染)

 urls.py

path('info/list/', views.info_list)

views.py

def info_list(request):
    # 1.获取数据库中所有用户信息
    # [对象,对象,对象]
    data_list = UserInfo.objects.all()
    # 2.渲染,返回给用户
    return render(request, "info_list.html", {"data_list": data_list})

info_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>INFO列表</h1>
<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>密码</th>
        <th>年龄</th>
    </tr>
    </thead>
    <tbody>
    {% for obj in data_list %}
        <tr>
            <td>{{ obj.id }}</td>
            <td>{{ obj.name }}</td>
            <td>{{ obj.password }}</td>
            <td>{{ obj.age }}</td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>

2、用户添加

URL

函数(GET,看到页面,输入内容             POST,提交->写入到数据库)

urls.py

path('info/add/', views.info_add)

views.py

def info_add(request):
    if request.method == "GET":
        return render(request, "info_add.html")
    user = request.POST.get("user")
    pwd = request.POST.get("pwd")
    age = request.POST.get("age")

    # 添加到数据库
    UserInfo.objects.create(name=user, password=pwd, age=age)
    # 自动跳转
    # return redirect("http://127.0.0.1:8000/info/list/")
    return redirect("/info/list/")

info_add.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>添加用户</h1>
<form method="post" action="/info/add/">
    {% csrf_token %}
    <input type="text" name="user" placeholder="用户名">
    <input type="text" name="pwd" placeholder="密码">
    <input type="text" name="age" placeholder="年龄">
    <input type="submit" value="提交">
</form>
</body>
</html>

3、用户删除

url

函数

http://127.0.0.1:8000/info/delete/?nid=1
http://127.0.0.1:8000/info/delete/?nid=2
http://127.0.0.1:8000/info/delete/?nid=3

def 函数(request):
    nid = reuqest.GET.get("nid")
    UserInfo.objects.filter(id=nid).delete()
    return HttpResponse("删除成功")

 urls.py

path('info/delete/', views.info_delete)

views.py

def info_delete(request):
    nid = request.GET.get('nid')
    UserInfo.objects.filter(id=nid).delete()
    return redirect("/info/list/")

info_list.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>INFO列表</h1>
<a href="/info/add/">添加</a>
<table border="1">
    <thead>
    <tr>
        <th>ID</th>
        <th>姓名</th>
        <th>密码</th>
        <th>年龄</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    {% for obj in data_list %}
        <tr>
            <td>{{ obj.id }}</td>
            <td>{{ obj.name }}</td>
            <td>{{ obj.password }}</td>
            <td>{{ obj.age }}</td>
            <td>
                <a href="/info/delete/?nid={{ obj.id}}">删除</a>
            </td>
        </tr>
    {% endfor %}
    </tbody>
</table>
</body>
</html>