zoukankan      html  css  js  c++  java
  • python全栈开发_day50_django

    今日内容
    手把手带你写登录功能
    pycharm连接数据库
    orm简单操作
    图书管理系统表分析



    登录功能
    1.路由访问如果不加斜杠 会内部自动重定向加斜杠的路由



    所有的html文件默认都写在templates文件夹下

    所有的静态文件(css,js,前端第三方类库)默认都放在static文件夹下

    html页面引入外部资源的方式
    cdn
    本地


    静态文件配置
    STATIC_URL = '/static/'
    # 静态文件配置
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static')
    ]
    # 暴露给外界能够访问服务器静态文件夹下面所有的资源


    STATIC_URL = '/xxx/' # 接口前缀 跟你的静态文件夹的名字一点关系都没有
    # 默认情况下这个前缀跟静态文件夹名字一样!!!
    # 静态文件配置
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'), # 就是你的静态文件夹路径
    os.path.join(BASE_DIR,'static1'),
    os.path.join(BASE_DIR,'static2')
    ]
    # ps:会依次查找列表中所有的静态文件路径 找到的话立刻停止,都没有找到返回404



    form表单触发提交数据的动作两种方式
    <input type="submit">
    <button></button>

    form提交数据的地址如何指定及方式?
    action属性控制提交的地址
    方式:
    1.全路径
    <form action="http://127.0.0.1:8000/login/">
    2.只写路径后缀
    <form action="/login/">
    3.不写 (默认往当前路径提交)
    form表单默认是get请求


    根据客户端请求方式的不同执行不同的逻辑代码
    def login(request):
    # 获取用户端提交的请求方式
    print(request.method) # 拿到的请求方式是全大写的字符串
    if request.method == 'GET':
    return render(request,'login.html')
    elif request.method == 'POST':
    return HttpResponse("收到了 老弟")

    个人建议按照下面这种方式书写 减少代码冗余及结构混乱的问题
    def login(request):
    if request.method == 'POST':
    return HttpResponse('OK')
    return render(request,'login.html')


    def login(request):
    # 获取用户端提交的请求方式
    print(request.method) # 拿到的请求方式是全大写的字符串
    # if request.method == 'GET':
    # return render(request,'login.html')
    # elif request.method == 'POST':
    # return HttpResponse("收到了 老弟")
    if request.method == 'POST':
    print(request.POST) # 你就把它当成一个大字典里面存放了客户端post提交的所有的数据
    # request.POST:< QueryDict: {'username': ['jason'], 'password': ['123']} >
    print(request.POST.get('username')) # value虽然是个列表但是获取value的时候拿到却是单个元素
    # 默认只会取value列表里面的最后一个元素
    # request.POST:<QueryDict: {'username': ['jason', 'egon'], 'password': ['123']}>
    print(request.POST.getlist('username')) # 要想一次性获取value列表里面所有的数据需要用getlist()
    # ['jason', 'egon']
    print(request.POST['password']) # 不推荐使用该方法获取数据
    return HttpResponse('OK')
    return render(request,'login.html')

    获取value列表里面所有的元素需要使用getlist 应用场景:用户的爱好 多选框
    get只会获取到value列表的最后一个元素



    print(request.GET) # <QueryDict: {'username': ['jason'], 'password': ['123']}>
    request.GET.get('user')
    # <QueryDict: {'username': ['jason','egon'], 'password': ['123']}>
    request.GET.getlist('username')



    django连接数据库
    1.需要修改配置文件
    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'day54',
    'HOST':'127.0.0.1',
    'PORT':3306,
    'USER':'root',
    'PASSWORD':'123'
    }
    }
    ps:键必须都是大写

    2.告诉django用pymysql替换它默认mysqldb模块连接数据库
    方式1:在你的项目文件夹下面的__init__.py
    方式2:也可以在你的应用文件夹下面的__init__.py

    # 固定写法
    import pymysql
    pymysql.install_as_MySQLdb() # 告诉django用pymysql代替mysqldb连接数据库


    什么是ORM?
    对象关系映射
    类 》》》 表
    对象 》》》 表记录
    对象的属性 》》》 一条记录某个字段对应的值


    django的orm不能够自动帮你创建库,但是可以自动帮你创建表

    提示:一个django项目就使用一个库,不要多个django项目使用一个库






    数据库迁移(同步)命令(******)
    python3 manage.py makemigrations 将你的数据库变动记录到一个小本本上(并不会帮你创建表)
    python3 manage.py migrate 将你的数据库变动正在同步到数据库中





    新增数据
    # 操作数据库user表插入数据
    # 方式1:
    user_obj = models.User.objects.create(name=username,password=password)
    # 方式2:
    user_obj = models.User(name=username,password=password)
    user_obj.save() # 对象调用save方法保存到数据库


    查询数据

    user_list = models.User.objects.all() # 获取user表所有的数据
    # 只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句
    print(user_list.query)



    利用a标签href属性 可以指定页面跳转的路径 href可以写全路径 但是推荐写后缀即可
    <a href="/reg/" class="btn btn-success">添加数据</a>
    # 注意 路径的书写一定要加斜杠

    重定向 可以写别人的网址也可以是自己的路径
    return redirect('/userlist')
    return redirect('/userlist/')



    queryset对象支持索引取值 但是不推荐你使用 推荐使用自带的.first()帮你获取第一条数据


    删除
    models.User.objects.filter(id=1).delete() # 会将queryset所有的数据对象全部删除




    查询数据需要注意的是你获取到的到底是一个queryset还是一个数据对象
    user_query = models.User.objects.filter(id=edit_id).first() # 如果你是要获取数据对象first千万别忘了
    # filter当条件不存在的情况下会返回一个空的queryset对象
    <QuerySet []> <class 'django.db.models.query.QuerySet'>

    user_obj = models.User.objects.get(id=edit_id) # 用get可以直接获取到数据对象本身但是查询条件不存在的情况下直接报错




    编辑
    编辑对象的id的获取方式
    方式1:利用input隐藏一个标签
    <input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
    方式2:
    <form action="/edit/?edit_id={{ user_obj.pk }}" method="post">

    注意:queryset对象点修改 删除 会作用于对象内部所有的数据对象 类似于批量操作
    方式1:
    models.User.objects.filter(id=edit_id).update(name=username,password=password)
    方式2:获取到当前数据对象
    user_obj = models.User.objects.filter(id=edit_id).first()
    user_obj.name = username
    user_obj.save()



    修改模型层里面的跟表相关的所有的数据,只要你修改了就必须重新执行数据库迁移命令
    python manage.py makemigrations 记录到小本本上
    python manage.py migrate 真正操作数据库






    django请求生命周期



    图书管理系统表设计
    书籍表


    作者


    出版社

    外键字段名 orm会自动在字段名后面加_id.无论你的字段名有没有_id
  • 相关阅读:
    openlayers + webpack
    openlayers Map 和 es6的容器Map重名
    git 代理
    剑魂史诗套配装
    剑魂卢克攻略
    DNF斩铁剑魂每日1-5及打团须知
    APP自识别安卓苹果
    各浏览器老板键
    Apache+mod_encoding解决URL中文编码问题
    linux命令之crontab定时执行任务
  • 原文地址:https://www.cnblogs.com/xuxingping/p/10995169.html
Copyright © 2011-2022 走看看