zoukankan      html  css  js  c++  java
  • Django入门

    一、django介绍

    复制代码
        ①启用django注意事项(*****):
                  计算机的名称不能有中文
                  一个pycharm就是一个项目
                  项目名不能起中文
    
    ②下载:   推荐下载1.11.11版本   两种下载方式: 命令行直接下载:pip3 install django==1.11.11 pycharm下载   验证下载是否成功: cmd --> django-admin
    ③创建django项目的两种方式:   方式一:命令行创建 创建django项目:cmd -> D: -> django-admin startproject 项目名 创建app应用: cd 项目名 -> python3 manage.py startapp app01 启动django项目:python3 manage.py runserver ps:用命令行创建django默认不会自动创建templates文件夹 需要你手动自己创建(注意改文件夹路径是否被添加配置文件中)
      方式二:pycharm创建 创建django项目:file >>> new project 选择第二个django ps:需要注意名字不能有中文,选择本地的解释器,勾选后台管理 创建app:方式一:pycharm命令行创建 -> python3 manage.py startapp app01 方式二:Tools下面run manage.py task功能栏 -> startapp app01 启动点击小绿色箭头
      强调:1.用django一定要保证只有一个在运行状态   2.一定记得清浏览器的缓存 ④app应用概念:   一个django项目就是一所大学   app就是大学里面的学院   注意:新创建的app需要在配置文件中注册才能生效(*****)   INSTALLED_APPS = [   'django.contrib.admin',   'django.contrib.auth',   'django.contrib.contenttypes',   'django.contrib.sessions',   'django.contrib.messages',   'django.contrib.staticfiles',   'app01.apps.App01Config' # 可以用全称   'app01' # 也可以简写   ]
    复制代码

     

     

    二、Django各个文件的作用

    三、Django三板斧

    复制代码
        from django.shortcuts import render,HttpResponse,redirect
    
        ①HttpResponse 返回字符串 HttpResponse('hello world')
        ②render 返回一个html页面 render(request, 'reg.html')
                 两种给前端页面传值的方式
                    方式一:def reg(request):
                            user_dict = {'name':'jason','password':'123'}
                            return render(request,'reg.html',{'user_dict':user_dict})
                    方式二:def reg(request):
                            user_dict = {'name':'jason','password':'123'}
                            return render(request,'reg.html',locals())
        ③redirect 重定向 redirect('http://www.xiaohuar.com')
    
        django识别到你的代码变化之后会自动刷新,但是有时候反应速度比较慢,
        你可以手动重启,也可以多刷新几次浏览器
    复制代码

    四、动静态网页

    静态网页:页面上的数据都是写死的
    动态网页:页面上的数据是从后端动态获取的
                  比如后端获取当前时间
                  后端获取数据库数据然后传递给前端页面

    五、模板渲染

    复制代码
    后端生成的数据直接传递给前端页面使用(并且前端页面可以灵活的操作改数据)
    
    模板渲染:模板语法需要依赖于第三方模块:
            pip3 install jinja2
    
    模板语法:inja2支持前端直接使用类似于python的语法操作数据
            <p>{{ user_dic }}</p>
            <p>{{ user_dic.name }}</p>
            <p>{{ user_dic['password'] }}</p>
            <p>{{ user_dic.get('name') }}</p>
    
            {% for user in user_dict %}  <!--[{},{},{},{}]-->
            <tr>
               <td>{{ user.id }}</td>
               <td>{{ user.name }}</td>
               <td>{{ user.password }}</td>
            </tr>
            {% endfor %}
    复制代码

     

    六、静态文件配置

    静态文件配置
        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用get和post提交数据

    1、form提交数据的地址指定的三种方式

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

    2、post与get执行代码块

    def login(request):
        if request.method == 'POST':
           return HttpResponse('OK')
        return render(request,'login.html')
    def login(request):
        # 获取用户端提交的请求方式
        print(request.method)  # 拿到的请求方式是全大写的字符串
        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列表的最后一个元素
        
        
        # 获取get请求数据的方式跟post请求完全一样
        print(request.GET)  # <QueryDict: {'username': ['jason'], 'password': ['123']}>
        request.GET.get('user')  
        # <QueryDict: {'username': ['jason','egon'], 'password': ['123']}>
        request.GET.getlist('username')
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <h1>登录页面</h1>
            <div class="col-md-6 col-md-offset-3">
                <form action="" method="post">
                    <p>username:<input type="text" class="form-control" name="username"></p>
                    <p>password:<input type="password" class="form-control" name="password"></p>
                    <input type="submit" class="btn btn-primary">
                </form>
            </div>
        </div>
    </div>
    
    </body>
    </html>
    login.html

    八、django连接数据库

        1.需要修改settings配置文件
            DATABASES = {
                'default': {
                    'ENGINE': 'django.db.backends.mysql',
                    'NAME': 'day54',
                    'HOST':'127.0.0.1',
                    'PORT':3306,
                    'USER':'root',
                    'PASSWORD':'3822515'
                }
            }
            ps:键必须都是大写
        
        2.告诉django用pymysql替换它默认mysqldb模块连接数据库
            方式1:在你的项目文件夹下面的__init__.py  默认在此init里写
            方式2:也可以在你的应用文件夹下面的__init__.py
            
            # 固定写法
            import pymysql
            pymysql.install_as_MySQLdb()  # 告诉django用pymysql代替mysqldb连接数据库
        

    九、ORM

    什么是ORM:
        对象关系映射
            类             >>>   表
            对象           >>>   表记录
            对象的属性      >>>   一条记录某个字段对应的值
        
    django的orm不能够自动帮你创建库,但是可以自动帮你创建表,所以需要自己手动创建库
    提示:一个django项目就使用一个库,不要多个django项目使用一个库

    十、数据库迁移命令

    1、方式一:pycharm命令行

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

     2、方式二:快捷键Tools

    Tools --->>> Run manage.py Task
    
            makemigrations
            migrate

    十一、ORM操作数据库

    1、新增数据

    # 方式1:
    user_obj = models.User.objects.create(name=username,password=password)
    # 方式2:
    user_obj = models.User(name=username,password=password)
    user_obj.save()  # 对象调用save方法保存到数据库
    def reg(request):
        if request.method == 'POST':
            # 获取用户名输入的用户名和密码
            username = request.POST.get('username')
            password = request.POST.get('password')
            # 操作数据库user表插入数据
    
            # 方式一
            # user_obj = models.User.objects.create(name=username, password=password)
    
            # 方式二
            # user_obj = models.User(name=username, password=password)
            # user_obj.save()   # 对象调用save方法保存到数据库
    
            print(user_obj)
            print(user_obj.pk)  # 获取主键字段对应的值,无论你的主键叫什么名字
            print(user_obj.name)  # 获取用户数据的name值
            print(user_obj.password)  # 获取用户数据的password值
    
            return HttpResponse('注册成功')
        return render(request, 'reg.html')
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <h1>注册页面</h1>
            <div class="col-md-8 col-md-offset-2">
                <form action="" method="post">
                    <p>username:<input type="text" name="username" class="form-control"></p>
                    <p>password<input type="password" name="password" class="form-control"></p>
                    <input type="submit" class="btn btn-primary">
                </form>
            </div>
        </div>
    </div>
    
    </body>
    </html>
    reg.html

    2、查询数据

    user_list = models.User.objects.all()  # 获取user表所有的数据
    # 只要是QuerySet就可以点query查看获取到当前QuerySet对象的内部sql语句
    print(user_list.query) 
    def userlist(request):
        # 获取数据库数据
        user_list = models.User.objects.all()  # 获取user表中所有的数据  select * from user
      return render(request, 'userlist.html', locals())
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <h1>展示数据</h1>
            <div class="col-md-8 col-md-offset-2">
            <a href="/reg/" class="btn btn-success">添加数据</a>
                <table class="table table-striped table-bordered table-hover">
                    <thead>
                        <tr>
                            <th>id</th>
                            <th>name</th>
                            <th>password</th>
                            <th>action</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for user_obj in user_list %}  {# user_list = [obj1,obj2,obj3] #}
                        <tr>
                            <td>{{ user_obj.pk }}</td>
                            <td>{{ user_obj.name }}</td>
                            <td>{{ user_obj.password }}</td>
                            <td>
                                <a href="/edit/?edit_id={{ user_obj.pk }}" class="btn btn-primary">编辑</a>
                                <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn btn-danger">删除</a>
                            </td>
                        </tr>
                        {% endfor %}
    
                    </tbody>
                </table>
    
            </div>
        </div>
    </div>
    
    </body>
    </html>
    userlist.html

    3、删除数据

    models.User.objects.filter(id=1).delete()  # 会将queryset所有的数据对象全部删除
    def delete_user(request):
        # 从get请求携带的参数中获取用户想要删除的数据id
        delete_id = request.GET.get('delete_id')
        # print(delete_id)
        models.User.objects.filter(id=delete_id).delete()
        # print(res)  # <QuerySet [<User: tank>]>
        # print(type(res))  # <class 'django.db.models.query.QuerySet'>
        return redirect('/userlist/')

    4、编辑数据

    编辑对象的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()
    def edit(request):
        if request.method == 'POST':
            username = request.POST.get('username')
            password = request.POST.get('password')
            # 获取编辑对象id的方式
            edit_id = request.POST.get('edit_id')
    
            # 更新数据库
            models.User.objects.filter(id=edit_id).update(name=username, password=password)
            return redirect('/userlist/')
    
        # 获取用户想要修改的数据的id
        edit_id = request.GET.get('edit_id')
    
        # 将该数据查询出来渲染到一个编辑页面
        # 查询方式一
        user_obj = models.User.objects.filter(id=edit_id).first()
    
        # 查询方式二
        # user_obj = models.User.objects.get(id=edit_id)
    
        # 将当前数据渲染到一个编辑页面上
        return render(request, 'edit.html', locals())
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
        <link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">
        <script src="/static/bootstrap-3.3.7/js/bootstrap.min.js"></script>
    
    </head>
    <body>
    
    <div class="container">
        <div class="row">
            <h1>编辑页面</h1>
            <div class="col-md-6 col-md-offset-3">
                <form action="" method="post">
                    <input type="hidden" name="edit_id" value="{{ user_obj.pk }}">
                    <p>username:<input type="text" name="username" class="form-control" value="{{ user_obj.name }}"></p>
                    <p>password:<input type="text" name="password" class="form-control" value="{{ user_obj.password }}"></p>
                    <input type="submit" class="btn btn-warning">
                </form>
            </div>
        </div>
    </div>
    
    </body>
    </html>
    edit.html
  • 相关阅读:
    10本Java程序员有助成长的书
    Java最新学习路线图
    2020最新版Java学习路线图
    自己的Java学习经历
    Java并发编程学习教程
    2020年最新Java学习路线
    Java Stream入门知识讲解
    你可能不知道的java14新特性
    Windows下获取当前目录路径,及创建新的文件夹方法
    win10下_findnext报oxc0000005错误解决
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/10986122.html
Copyright © 2011-2022 走看看