zoukankan      html  css  js  c++  java
  • Django知识整理二(小白必会三把斧,静态文件配置,动态接口解析,form表单,request对象及方法,djdango连接数据库,字段的增删改查,数据的增删改查)

    小白必会三把斧(返回方式)

    1. HttpResponse # 返回字符串的

      def login(request):
           return HttpResponse('hello baby~')
      
    2. render # 返回html页面

      def reg(request):
          user_dict = {'name':'jason','pwd':123}
          # return render(request,'reg.html')
          # 给模板传值的方式1
          # return render(request, 'reg.html',{'xxx':user_dict})  # 将user_dict传递给reg.html页面 页面上通过xxx就能够获取到该字典
          # 给模板传值的方式2
          return render(request,'reg.html',locals())  # 会将当前名称空间中所有的变量名全部传递给reg.html页面
          # locals()  缺点会出现效率问题
      
    3. redirect # 重定向

       def home(request):
           # 返回路由
           # return redirect('/index')
           # 返回第三方网站
           return redirect('http://www.baidu.com')
      

    静态文件配置(以登录功能为例)

    静态文件:
    网站所用到的
    自己写好js文件
    自己写好css文件
    第三方的框架 bootstrap fontwesome sweetalert

    通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下,手动创建一个static文件夹

        STATIC_URL = '/static/'  # 是访问静态资源的接口前缀
        """只要你想访问静态资源 你就必须以static开头"""
        # 手动配置静态文件访问资源
        STATICFILES_DIRS = [
            os.path.join(BASE_DIR,'static'),
            # os.path.join(BASE_DIR,'static1'),
            # os.path.join(BASE_DIR,'static2'),
        ]# 可配置多个文件夹
    

    静态文件动态解析

    前端页面代码

    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>
    

    前端form表单知识补充(以登录功能为例)

    在form表单中action参数可以写的形式:
    1.不写 默认朝当前地址提交
    2.只写后缀/index/
    3.写全路径

    form表单中method参数默认朝后端提交的方式是get请求,但是get请求携带参数的方式 是在url后面(url?username=admin&password=213213213213213)
    缺点:
    1.不安全
    2.get请求携带的参数有大小限制(最大不能超过4KB左右)

    所以我们需要在在form表单中的method参数改成post请求

    注意:
    前期你如果要提交post请求,前端页面就会报错. 你需要去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',
        ]
    
    

    request对象交互(以登录功能为例)

    获取post请求携带的数据(大写)

    request.POST
    

    获取get请求携带的数据(大写)

    request.GET
    

    get和post在后端获取用户数据的时候 规律是一样的,数据都是字典套列表的格式

    def login(request):
        # if request.method == 'GET':
        #     # 你应该针对不同的请求方式 有不同的处理逻辑
        #     # print('走了我')
        #     # 获取请求方式  结果是一个大写的字符串
        #     print(request.method,type(request.method))
        #     return render(request,'login.html')
        # elif request.method == 'POST':
        #     pass
        """由于get请求比较常见 并且业务逻辑简单 所以针对get不需要做逻辑判断 默认就是get请求"""
        if request.method == 'POST':
            # 获取前端传递过来的用户名和密码
            print(request.POST)  # post请求提交过来的数据  <QueryDict: {'username': ['admin'], 'password': ['123']}>
            # 你可以直接将request.POST当成字典即可
            username = request.POST.get('username')
            password = request.POST.get('password')
            hobby = request.POST.getlist('hobby')
            print(username,type(username))
            print(password,type(password))
            print(hobby,type(hobby))  
    '''
    <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
    tank <class 'str'>
    123 <class 'str'>
    request.POST.get('username') 默认只取列列表的最后一个元素
    如果你想将列表完整的取出 你必须用getlist()
    '''
    

    django连接数据库

    第一步

    配置文件中配置:

                    DATABASES = {
                        'default': {
                             # 指定数据库 MySQL postgreSQL
                            'ENGINE': 'django.db.backends.mysql', 
                            'NAME': 'day56',  # 到底使用哪个库
                            'USER':'root',   # 用户
                            'PASSWORD':'root', # 密码
                            'HOST':'127.0.0.1',  # 地址
                            'PORT':3306, # 端口
                            'CHARSET':'utf8'  # 字符编码
                        }
                    }
        
    
    
    

    第二步

    django默认使用的是mysqldb连接数据库 但是该模块不支持了
    所以你要告诉django不要用mysqldb该用pymysql连接

        你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
                    import pymysql
                    pymysql.install_as_MySQLdb()
    

    django orm简介(以登录功能为例)

    orm对象关系映射
    类     -------   数据库的表
        
    对象    -------   表的记录
        
    对象获取属性  -------   记录的某个字段对应的值
        
    优点:能够让一个不会数据库操作的人 也能够简单快捷去使用数据库
        
    缺点:由于封装程度太高 可能会导致程序的执行效率偏低,有时候 结合项目需求可能需要你手写sql语句
        
    注意事项
    1.django的orm不会自动帮你创建库,库需要你自己手动创建表会自动帮你创建,你只需要书写符合django orm语法的代码即可
    

    在models.py文件中书写类

    from django.db import models
    
     # Create your models here.
     class Userinfo(models.Model):
        # 设置id字段为userinfo表的主键  id int primary key auto_increment
        id = models.AutoField(primary_key=True)  # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
        # 设置username字段  username varchar(64)  CharField必须要指定max_length参数
        username = models.CharField(max_length=64)  # 在django orm中 没有char字段  但是django 暴露给用户 可以自定义char字段
        # 设置password字段  password int
        password = models.IntegerField()
         
    

    字段的增删改查

    增:
        # 直接在原来的类中添加字段即可
        phone = models.BigIntegerField(default=110)  # 新增的字段 可以提前设置默认值
        addr = models.CharField(max_length=64,null=True)  # 新增的字段 可以设置为空
        
        
    删:
        # 不能直接删除,注释就可以了
        # addr = models.CharField(max_length=64,null=True)  # 新增的字段 可以设置为空
    
        
    改:
        # 直接在原字段上修改
        username = models.CharField(max_length=32)
        
        
    查:
        # 可以通过pycharm自带的功能查询,也可以使用Navicat查询
    

    数据库迁移(同步)命令

    *****数据库迁移(同步)命令******
    python manage.py makemigrations  # 不会创建表 仅仅是生成一个记录  将你当前的操作记录到一个小本本上(migrations文件夹)
        
    python manage.py migrate  # 将你的orm语句真正的迁移到(同步)到数据库中
        
        
    只要你在models.py中修改了跟数据库相关的代码  你就必须重新开始执行上面两条命令   
    

    数据的增删改查

    查:(以登录功能为例)

    def login(request):
        if request.method == 'POST':
            username = request.POST.get("username")
            password = request.POST.get("password")
            # 先以用户名为依据查询数据
            # 1.get()  当查询条件不存在的时候 会直接报错   如果存在会直接给你返回数据对象本身        不推荐使用
            # res = models.Userinfo.objects.get(username=username)  # select id,username,password from userinfo where username='jason'
            # print(res)
            # print(res.username)
            # print(res.password)
            # 2.filter()   当查询条件不存在的时候  不会报错而是返回一个空
            # 当条件存在的情况下 无论数据有几条返回的都是列表套对象的数据格式
            # filter可以当多个查询条件 并且是and关系
            res = models.Userinfo.objects.filter(username=username)  # select * from userinfo where username='jason' ;
            # user_obj = res[0]
            # user_obj = res[0:3]
            # user_obj = res[-1]  # 你可以将filter查询出来的结果当做列表去对待 支持正数的索引取值和切片 不支持负数
            user_obj = res.first()  # 取queryset第一个元素
            print(user_obj)
        return render(request,'login.html')
    

    增:(以注册功能为例)

    def reg(request):
        if request.method == 'POST':
            username = request.POST.get("username")
            password = request.POST.get("password")
            # 直接将用户名和密码写入数据库
            user_obj = models.Userinfo.objects.create(username=username,password=password)
            # insert into userinfo(username,password) values('admin','666');
            # create方法会有一个返回值  返回值就是当前被创建的数据对象
            print(user_obj)
        return render(request,'register.html')
    

    改:(以数据展示功能为例)

    def edit_user(request):
        # 1. 如何获取用户想要编辑的数据
        edit_id = request.GET.get('edit_id')
        if request.method == 'POST':
            # 将用户新修改的所有数据
            username = request.POST.get('username')
            password = request.POST.get('password')
            '''POST中也是可以获取到GET请求携带的参数'''
            # 去数据库中修改数据
            # 方式1:
            models.Userinfo.objects.filter(pk=edit_id).update(username=username, password=password) # 批量更新
            # 方式2:   获取当前数据对象  然后利用对象点属性的方法   先修改数据  然后调用对象方法保存
            # 不推荐使用第二种方式 save方法无论你是否修改都会把数据挨个重新写一遍,效率低
            # edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()
            # edit_obj.username = username
            # edit_obj.password = password
            # edit_obj.save()
            '''update方法会将filter查询出来的query对象中的所有数据对象全部更新'''
            # 跳转到数据展示页面
            return redirect('/userlist')
    

    删:(以数据展示功能为例)

    def delete_user(request):
        # 获取想要删除的数据id 直接删除
        # 正常的开发环境当中,数据是不会被删除的 通常给它一个字段is_delete 默认为0 删除改为1
        delete_id = request.GET.get('delete_id')
        models.Userinfo.objects.filter(pk=delete_id).delete()  #  批量删除
        return redirect('/userlist')
    

    补充:

    1. pk 的含义就是主键的意思,因为主键名有时不一定为id
    2. 因为想要获取用户选的哪一个数据进行编辑修改,就需要利用GET方法携带参数,在后面拼接edit_id和delete_id:
    <tbody>
        {% for user_obj in user_queryset %}
            <tr>
                <td>{{ user_obj.id }}</td>
                <td>{{ user_obj.username }}</td>
                <td>{{ user_obj.password }}</td>
                <td class="text-center">
                    <a href="/edit_user/?edit_id={{ user_obj.pk }}" class="btn-primary btn-sm">编辑</a>
                    <a href="/delete_user/?delete_id={{ user_obj.pk }}" class="btn-danger btn-sm">删除</a>
                </td>
            </tr>
        {% endfor %}
    </tbody>
    
  • 相关阅读:
    Codeforces Round #217 (Div. 2)B. Berland Bingo
    走迷宫1 bnu 1054
    MFC 对话框背景图片
    用Visual C++从位图文件生成任意形状的窗口
    poj 2245 Lotto
    poj 1797 Heavy Transportation
    poj 2253 Frogger
    poj 1125 Stockbroker Grapevine
    B. Books
    【转】阻塞与非阻塞socket的优缺点
  • 原文地址:https://www.cnblogs.com/asyouwish/p/11762692.html
Copyright © 2011-2022 走看看