静态文件配置

  • 视图函数都必须有返回值, 并且返回值都是HttpResponse对象

  • 默认情况下, 所有的html文件都是放在templates文件夹内

  • 用户在浏览器中输入网址能访问到对应的资源, 前提是后端提前开设了该资源的访问接口

  • 静态文件: 网站所使用到的提前写好的css, js, 第三方前端模块, 图片等都叫做静态资源

    默认情况下, 网站所用到的静态文件全部会放在static文件夹下,

    通常情况下会在static文件夹内再建立文件夹对不同静态文件加以区分,

    例如: css文件夹, js文件夹, font文件夹等,

    django中, 需要自己手动创建静态文件存放的文件夹

  • 禁止浏览器使用缓存: f12-->...-->Settings-->Network-->Disable cache

STATIC_URL = '/static/'  # 访问静态资源文件接口前缀
# STATIC_URL = '/xxx/'
STATICFILES_DIRS = [  # 静态资源所在文件夹路径
    os.path.join(BASE_DIR, 'static'),  # 将static文件里的所有资源上线到服务器
    os.path.join(BASE_DIR, 'static1')
]

# <script src="/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
  • 动态绑定静态文件, 映射关系: 多<==>一<==>一

    多: 动态变化的url后缀, 一: 文件夹路径, 一: 模板语法内置的static变量

        {% load static %}
        <script src="{% static 'jQuery.3.4.1.js' %}"></script>
        <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>
    

request对象的方法

form表单默认是get请求

  • get请求也能够携带参数

    • http://127.0.0.1:8000/login/?username=cql&password=123
    • 格式: url?xxx=xxx&yyy=yyy
  • get请求携带参数特点:

    1. 携带数据不安全
    2. 携带的数据大小有限制
    3. 通常只会携带一些不是很重要的数据
  • 在朝后端提交post请求出现403时, 需要去配置文件中注释掉一行内容,

    MIDDLEWARE-->'django.middleware.csrf.CsrfViewMiddleware', 中间件

  • 浏览器无论发get请求还是post请求, 都会执行django后端的视图函数

    • get请求, 获取login页面
    • post请求, 提交数据, 然后后端做校验
  • 获取前端请求方式: request.method, 大写的字符串

  • 获取用户提交的post请求的数据: request.POST, 相当于字典

    '''
        print(request.POST)  # <QueryDict: {'username': ['cql'], 'password': ['123']}>
        username = request.POST.get('username')
        password = request.POST.get('password')
        print(username, type(username))  # cql <class 'str'>
        print(password, type(password))  # 123 <class 'str'>
        
        username_lt = request.POST.getlist('username')
        print(username_lt, type(username_lt))  # ['cql'] <class 'list'>
        
        用get取值, 默认只取列表最后一个元素, 如果想获取列表, 需使用getlist
        
    '''
    
  • 获取用户提交的get请求的数据: request.GET, 更细粒度获取数据: request.GET.get, request.GET.getlist

django连接数据库

文件配置

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 指定数据库类型
        'NAME': 'django',  # 指定库的名字
        'USER': 'root',  # 键必须是全大写
        'PASSWORD': 'Cql123456',
        'HOST': '127.0.1.1',
        'PORT': 3306,
        'CHARSET': 'utf8'
    }
}

设置不用默认的mysqldb连接, 而是用pymysql连接

在项目名或者在应用名下的__inint__中书写代码指定

import pymysql

pymysql.install_as_MySQLdb()

django orm

orm优点: 能够让不会数据库操作的人也能够简单方便的操作数据库

orm缺点: 封装程度太高, 会出现查询效率低的问题

django中如何操作orm

  • 去models.py中书写模型类

    from django.db import models
    
    
    class User(models.Model):
        id = models.AutoField(primary_key=True)  # 当不指定主键时, django会自动创建一个名为id的主键字段
        username = models.CharField(max_length=32)  # CharField字段必须指定max_length参数 
        password = models.CharField(max_length=64)
    
  • 一个django项目对应一个数据库

  • 数据库迁移(同步)命令

    • python manage.py makemigrations, 将数据库的修改记录到app中的migrations文件夹内,类似于日志
    • python manage.py migrate, 将修改操作真正同步到数据库中
    • 自动加前缀区分(app01_user), 第一次自动创建默认功能表
    • 只要修改了models里面和数据库相关的代码, 就必须重新执行上面两条命令

字段的增删改查

  • 增加新字段

    '''
    email = models.EmailField()
    
    python manage.py makemigrations
    报错: without a default  # 未设置默认值
    解决:	
    	1) Provide a one-off default now  # 在cmd中直接提供默认值
    	2) Quit, and let me add a default in models.py  
    	# 在models对应的表类中设置默认值或允许为空, email = models.EmailFieldnull=True)
    
    '''
    
  • 删除字段: 在models对应的表类中直接注释掉对应的字段代码, 然后执行数据库迁移命令(谨慎使用)

完善登录功能

django orm 查询数据库中数据

def login(request):
    if request.method == "POST":
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 数据库查询数据, 结果为列表套数据对象, 可以用多个and关系的关键字参数查询
        data = models.User.objects.filter(username=username)

        if not data:
            return HttpResponse('当前用户不存在!')

        user_obj = data[0]
        if user_obj.password == password:
            return HttpResponse('登录成功!')
        return HttpResponse('密码错误!')

    return render(request, 'login.html')

展示 + 新增用户功能

django orm 新增数据库中数据

'''
1. 查询数据库中的所有数据展示到前端页面
2. 前端页面上针对不同的数据都有编辑和删除按钮
3. 点击对应的按钮能完成对应的操作
'''  
def show_user_lt(request):
    user_lt = models.User.objects.all()  # 等价于: models.User.objects.filter()
    return render(request, 'show_user_lt.html', {'userLt': user_lt})


def add_user(request):
    # 草稿: 给用户返回一个添加页面, 然后用户输入提交, 后端获取数据, 写入数据库, 并给重定向到数据展示页

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        
        # create新增数据方法返回值为当前被创建的对象本身
        user_obj = models.User.objects.create(username=username, password=password)  
        # print(user_obj, user_obj.username, user_obj.password)

        return redirect('/show_user_lt/')  # 添加成功后跳转到数据展示页

    return render(request, 'add_user.html')


class User(models.Model):
    username = models.CharField(max_length=32)
    
    # 跟数据库没有关系, 所以不需要执行数据库迁移命令
    def __str__(self):
        return self.username  # 该返回值必须是字符串类型

编辑 + 删除用户功能

模板语法的注释

{# {% endfor %}#}, 不会展示到前端, html的注释会展示到前端

django orm 修改数据库中数据

def edit_user(request):
    """
    草稿:
        返回一个编辑页面, 该页面上应该展示想要编辑的用户信息
        利用get请求携带参数的方式, 获取用户想要编辑的数据的id值
        将用户想要编辑的数据查询出来, 展示到编辑页面上, 供用户修改
    """
    edit_id = request.GET.get('edit_id')
    edit_obj = models.User.objects.filter(id=edit_id).first()  # 不推荐索引取值

    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')

        # 修改数据方法: 批量操作, 会将filter查询出来的列表中的所有对象全部更新
        models.User.objects.filter(id=edit_id).update(username=username, password=password)

        return redirect('/show_user_lt/')

    return render(request, 'edit_user.html', {'edit_obj': edit_obj})
<!--在show_user_lt页面中通过模板语法为每条数据的编辑按钮设置不同的get请求携带参数-->
<tbody>
    {% for user_obj in userLt %}
    <tr>
        <td>
            <a href="/edit_user/?edit_id={{ user_obj.id }}" class="btn">编辑</a>
        </td>
    </tr>
    {% endfor %}
</tbody>

django orm 修改数据库中数据

def delete_user(request):
    delete_id = request.GET.get('delete_id')

    # 删除数据方法: 批量操作, 会将filter查询出来的列表中的所有对象全部删除
    models.User.objects.filter(id=delete_id).delete()

    return redirect('/show_user_lt/')