Django项目流程简单版

Django项目流程简单版

创建项目

一.创建Django项目

django-admin startproject 项目名
    跟项目名同名的文件夹
    __init__.py
    settings.py  暴露给用户可配置的配置文件
    urls.py
    wsgi.py
    manage.py

二.创建app

python3 manage.py startapp app名  
    app名的文件夹
    migrations文件夹  数据库操作记录
    __init__.py       
    apps.py             注册app相关文件
    admin.py            django后台管理相关
    models.py           orm模型类相关
    views.py            视图函数(函数/类)
    tests.py            测试相关

1.注意

# 1.用命令行创建项目 不会自动创建templates文件夹,也就意味着需要你手动创建并且需要在配置文件中将该路径添加上
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]
        ......
]
# 2.创建的app也需要在settings.py文件中注册
INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        # 'app01'  # 简写
        'app01.apps.App01Config'  # 全称
]

三.静态文件

1.什么是静态文件

对于前端已经写好了的文件 我们只是拿过来使用 那么这些文件都可以称之为叫"静态文件"

静态文件可以是:bootstrap一类的前段框架, 已经写好了的图片,css,js
静态文件默认全都放在static文件夹下,static文件夹中默认会创建的子文件夹(手动创建):
css文件夹  当前网站所有的样式文件
js文件  当前网站所有的js文件
img文件  当前网站所有的图片文件
其他(前端框架代码 第三方插件代码...)

2.静态文件配置

(1):将static文件夹路径配置到settings.py中

# settings.py文件中:
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
]
# 你只要输入static文件夹内具体文件的路径就能够访问到

(2):利用解析器"动态解析"静态文件接口前缀

<!--HTML文件中-->
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}">
<script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>

2.注意

# 在settings.py文件中:
STATIC_URL = '/static/'  # 这个static不是文件夹的名字 而是接口前缀
    """只要你想访问静态文件中的资源 文件路径就必须用static开头"""
    # 手动将static文件夹中所有的资源暴露给用户
    STATICFILES_DIRS = [
        os.path.join(BASE_DIR,'static'),  # 真正的文件夹路径
        os.path.join(BASE_DIR,'static1'),  # 真正的文件夹路径
        os.path.join(BASE_DIR,'static2'),  # 真正的文件夹路径
        os.path.join(BASE_DIR,'static3')  # 真正的文件夹路径
    ]  # 一旦你是以接口前缀开头的 那么就会自动拿着接口前缀后面的文件路径去列表中一个个的文件夹中查找文件

四.form表单

1.form表单默认是get请求,携带数据的方式是: url问号后跟数据

2.若是敏感信息需要将form表单的get请求该为post请求

<form action="" method="post">

3.注意:改为post请求后,需要去settings.py文件中注释掉一个中间键,否则报错

# settings.py 文件中注释掉中间键
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    # 'django.middleware.csrf.CsrfViewMiddleware',  # 此中间键注释掉
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

4.form表单提交数据目的地由action决定

1.不写的情况下 默认往当前地址提交
2.还可以写后缀/index/(项目常用这种)
3.还可以写全路径

五.获取前端数据

1.获取请求方法

request.method   # (GET/POST) 此时的GET/POST是字符串形式
ps:视图函数一般主要会先处理get请求

2.GET

request.GET 获取前端get请求的数据(就类似于是一个大字典)

print(request.GET)  
# <QueryDict: {'username': ['asd'], 'password': ['123']}> 注意:value值是列表

取值:

'取单个值'
request.GET.get('username')  
# 虽然value是一个列表 但是默认只取列表最后一个元素
username = request.GET['username']  # 不推荐使用,若username不存在会报错
'取列表'
request.GET.getlist('hobby')  # 获取到value列表中的所有元素(也是一个列表)

3.POST

request.POST 获取前端post提交的数据(就类似于是一个大字典)

print(request.POST)  
# <QueryDict: {'username': ['asd'], 'password': ['123']}>

取值

'取单个值'
request.POST.get('username')  
# 虽然value是一个列表 但是默认只取列表最后一个元素
username = request.POST['username']  # 不推荐使用,若username不存在会报错
'取列表'
request.GPOST.getlist('hobby')  # 获取到value列表中的所有元素(也是一个列表)

六.Django连接数据库

django默认使用的是自带的sqlite数据库

1.连接数据库 如MySQL

2.修改配置

如果你想让Django使用其他的数据库(如MySQL),需要在settings配置文件中配置

# settings.py文件中修改配置
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 将默认的注释掉
        'ENGINE':'django.db.backends.mysql',
        'NAME':'db4',  # 库名
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'root',
        'CHARSET':'utf8',
    }
}

3.告诉Django使用pyMySQL连接数据库

还要在项目名下的init文件或者是应用名下的init文件中告诉django不要使用默认的mysqldb,而是使用pymysql

import pymysql
pymysql.install_as_MySQLdb()

七.ORM(对象关系映射)

利用orm对数据库中的数据增删改查

1.首先要在应用下的models.py文件中书写模型类

class User(models.Model):
            # 将id字段设置为User表主键字段  在django orm中 你可以不写主键字典  django会默认给你的表创建一个名为id的主键字段
    id = models.AutoField(primary_key=True)  # 一旦你自己指定了主键字段 那么django就不会自动再帮你创建了
    username = models.CharField(max_length=32)  # username varchar(32)   CharField必须要指定max_length参数
    password = models.IntegerField()  # password int

2.数据库迁移(同步)命令

只要动了models中跟数据库相关的代码 就必须重新执行上面的两条命令 缺一不可(**)

python3 manage.py makemigrations  # 仅仅是在小本本上(migrations文件夹)记录数据库的修改 并不会直接操作数据
python3 manage.py migrate  # 将数据库修改记录 真正同步到数据库

3.表字段的增删改查

当一张表已经创建出来之后 后续还想添加字段,可以有两种方式

(1)给新增的字段设置默认值

addr = models.CharField(max_length=32,default='China')  # default该字段默认值

(2)给新增的字段设置成可以为空

age = models.IntegerField(null=True)  # 该字段允许为空

删除字段 直接在models.py中注释该字段 然后重新执行两条命令即可 注意:执行完之后 表中该字段所对应的所有的数据全部删除 并且一般情况下 基本是不会用到真正意义上的删除

4.表数据的增删改查

# 先将 models 模块导入 views.py 文件内
from app01 import models

models.User.objects.all()  # 直接拿所有的数据 拿到的是一个querySet对象 

(1) get() 方法

直接拿到数据对象本身,当查询条件不存在时报错
user_obj = models.User.objects.get(username=username)  # select * from user where username='jason'
user_obj = models.User.objects.get(pk=1)  # pk会自动查找到当前数据的主键字段
print(user_obj)  >>> User object
print(user_obj.username)  # 相当于数据对象.字段
print(user_obj.password)

(2) filter() 方法

1.filter查询出来的结果是一个列表,列表内是一个个的数据对象,用.first()
2.当查询条件不存在的时候,不会报错,只会返回一个空列表
3.filter括号内,支持写多个参数,并且参数与参数之间是and的关系
4.filter拿到的结果就是一个querySet对象(你现在只需要知道filter拿到的结果就能够点query查看sql语句)
ps: querySet对象,你可以把它当做列表操作,取值也可以通过索引取(querySet只支持正数索引,不支持负数) 还支持切片操作(切出来的结果还是一个querySet对象)
但是不推荐你这么做,易报错
res = models.User.objects.filter(username=username)
print(res)  # <QuerySet [<User: User object>]>
print(res.query) # 只有querySet对象才可以直接点query查看内部对应的sql语句
'''
SELECT `app01_user`.`id`, `app01_user`.`username`,`app01_user`.`password`, `app01_user`.`addr`FROM `app01_user`WHERE (`app01_user`.`username` = haha AND `app01_user`.`password` = 123)
'''
​
res = models.User.objects.filter(username=username).first() # 此时拿到的是数据对象

(3) exclude(**kwargs) 反取, 它包含了与所给筛选条件不匹配的对象

models.Book.objects.exclude(pk=1)  # 只要pk不是1的数据全部查询出来

(4) order_by(*field) 对查询结果排序

models.Book.objects.order_by('price')  # 默认是升序
models.Book.objects.order_by('-price')  # 加负号就是降序

(5) reverse() 对查询结果反向排序 >> 前面要先有排序才能反向

models.Book.objects.order_by('price').reverse()

(6) count() 对查询出来的结果进行一个计数

models.Book.objects.count()

(7) last(): 返回最后一条记录

models.Book.objects.all().last()

(8) exists(): 如果QuerySet包含数据,就返回True,否则返回False

models.Book.objects.filter(pk=1000).exists()

(9) values(*field)

models.Book.objects.values('title','price')  # 得到的结果是列表套字典

(10) values_list(*field)

models.Book.objects.values_list('title','price')  # 得到的结果是列表套元组

(11) distinct(): 从返回结果中剔除重复纪录

models.Book.objects.values('title','price','create_time').distinct()

(1) create()

1.create方法能够新增数据 并且有一个返回值
2.返回值就是新增的数据对象本身
res = models.User.objects.create(username=username,password=password)
# insert into user(username,password) values(username,password)
print(res)  >>> User object
print(res.password)
print(res.username)

(2) 普通方法

user_obj = models.User(username=username, password=password)
user_obj.save()

models.User.objects.filter(条件).delete()
# delete from user where id = delete_id;
ps: querySet 对象可以用.delete() 方法

(1) update()

models.User.objects.filter(id=edit_id).update(username=username,password=password)
# update user set username = username,password = password where id = edit_id
"""
filter拿到是一个列表   filter操作其实都是批量操作
如果filter结果列表中有多个数据 那么会一次性全部修改 
类似于for循环一个个修改
"""
ps: querySet 对象可以用.update() 方法

(2) 普通方法

edit_obj.username = username
edit_obj.password = password
edit_obj.save()
"""
第二种方式会从头到尾将所有的字段全部修改一遍  效率极低,不推荐使用
"""

 

补充

用户可以访问的资源都在url.py中
只有url中开设相关的资源才能被访问到(******)
后端资源一般都需要手动指定是否需要暴露给用户

八.Django请求生命周期

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/waller/p/11553115.html