• 9_16Django中的静态文件和orm


    一。静态文件配置

      在配置静态文件时,需要创建一个文件夹在Django项目文件夹下,名字与使用无关。

      静态文件包括html等使用的不会变动的插件文件等。分为三个部分:

        css文件夹 当前网站所有的样式文件

        js文件  当前网站所有的js文件

        img文件 当前网站所有的图片文件

        其他(前端框架代码)。

      1.在静态文件的调用时,不能直接在html文件夹中使用相对路径或绝对路径进行调用,因为在页面访问的时后不会获取到该插件资源,所以需要将所有静态文件暴露给访客,使得访客可以获得。

      在Django中可以使用以下代码进行资源暴露:

    STATIC_URL = '/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')  # 真正的文件夹路径
    ]

      这样在html文件中调用静态文件就需要以STATIC_URL中的参数为地址头,框架会自动在STATICFILES_DIRS路径中的所有文件夹中遍历,找到该文件的资源位置。

        <link rel="stylesheet" href="/xxx/bootstrap-3.3.7-dist/css/bootstrap.min.css">
        <script src="/xxx/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>

      其中xxx可以是任意字符,只要和STATIC_URL中的地址符合即可。如果STATIC_URL中的值变动,需要对所有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>

      load static就是加载一个静态符号。

    二。form表单提交方式.

      一般的,网页提交数据的方法有两种:GET 和POST,他们取决与前端form表单中 的methon中的值。  

      get请求方法一般是要请求页面资源时使用,它所提交的数据会暴露在url后面,所以一般提交数据使用的都是post方法。

      在django中,视图函数会接受到一个request参数,这个参数会将请求的方法返回给后端,端可以通过次方法识别请求数据的类型,因为对与请求页面来说请求方法时get而提交数据需要使用post。语法如下

    def login(request):
        if request.method == 'GET':
            return render(request, 'login.html')
        print('1111')
        print(request.POST)
        return HttpResponse('收到了!')

      注意,在前期学习django时,涉及到post方法的时候会报错403,为了避免这个错误,需要修改框架settings中的数据:

    改成post请求之后 需要去settings文件中注释掉一个中间件
        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是一个对象:<WSGIRequest: POST '/login/'>

      其中可以对其取值POST和GET,这两个数据类型是QueryDict,是一个类似于字典类型,可以满足字典的所有取值方法。

      通过request.POST.get('参数名')来取得对应的值。取出的值是str类型

      也可以通过request.POST['参数名']来获取值,但不推荐使用这个方法。

      返回的是一个字典加列表的形式,因为可能出现一个参数名对应多个值的情况出现

    <QueryDict: {'username': ['123'], 'password': ['123'], 'tj': ['登录']}>

      如果对一个有多个值的列表使用get取值只会取到最后一个这个值,所以对于有多个值的参数使用getlist方法。取出的值类型是list。

    request.GET.getlist('hobby')

    三。django数据库配置。

      django使用的默认数据库是sqlite,如果要使用其他数据库,需要在settingts中配置文件DATABASES,将他配置为mysql的数据库所需要的资源:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'day51',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'USER':'root',
            'PASSWORD':'123',
            'CHARSET':'utf8'
            }

      而此时django使用的连接数据库的模块还是mysqldb,要让他改为pymysql进行连接,需要在项目的初始化或者app的初始化中将其修改,:

    import pymysql
    pymysql.install_as_MySQLdb()

      pycharm中也有自带的处理数据的功能:

       选择mysql进行配置。第一次配置需要下载一个控件:

       安装后即可使用。

    四。django中的orm

      之前的自制的简易orm中有以下对应关系。

      表==》类

      表中的记录=》类创建的对象

      字段中每个记录的值=》对象中的属性

      所以可以创建一个类作为一个表:

    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

      其中django会自己给你定义一个主键,如果你的表中没有主键,名为id

      再每次数据表变动之后都需要进行迁移(同步)命令才能更新数据库中的表。

      在cmd中执行以下命令:

      python3 manage.py makemigrations

        仅仅是在小本本上(migrations文件夹)记录数据库的修改 并不会直接操作数据

      python3 manage.py migrate

        将数据库修改记录 真正同步到数据库。

      每当models中的数据库相关代码改变后,就需要执行以上的代码进行修改数据库。

      在控制台也有简写法:

      makemigrations

      migrate

    五。字段的增删查改:

      增  

        如果表被创建出来之后,后期还想添加新的字段,有两种方法。

        如果直接强行添加新字段而不执行1,2操作的话,系统会出现以下提示

    You are trying to add a non-nullable field 'addr' to user2 without a default; we can't do that (the database needs
    something to populate existing rows).
    Please select a fix:
     1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
     2) Quit, and let me add a default in models.py

        就是这个字段没有给定初始值,不能作为字段添加,这是为了防止原有的表中有相关数据,需要给定一个初始值,解决方法如下:

        1.给行动字段设置默认值。

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

        2.设置新的字段可以为空。

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

      删:

      删除字段 直接在models.py中注释该字段 然后重新执行两条命令即可。

      注意:执行完之后 表中该字段所对应的所有的数据全部删除。

      并且一般情况下 基本是不会用到真正意义上的删除。

    六。数据的增删查改:

      首先需要导入models模块

      查:

      查询所有数据:

    models.User.objects.all()  # 直接拿所有的数据

      查询数据的方法有两种:

      1:使用get方法:

    user_obj = models.User.objects.get(username=username)  

    # select * from user where username='jason'

      这种方法得出的obj就是对象本身,但是不推荐使用这个方法,当对象不存在时,会报错。

      2.filter:

    res = models.User.objects.filter(username=username,password=password)

      filter方法拿到的是一个QUERYSet对象,而我们可以通过以下方法获取其中的sql语句:

    res.query
    #SELECT `app01_user`.`id`, `app01_user`.`username`, 
    `app01_user`.`password` FROM `app01_user` WHERE (`app01_user`.`username`
    =
    jason AND `app01_user`.`password` = 123)

      其操作方法和列表相差无几,

      可以支持正索引取值,不支持负索引取值。不推荐使用。

      可以支持正切片,也不推荐使用。

      推荐使用first方法,取出其中的第一个值:

    user_obj = models.User.objects.filter(username=username).first()

      其内部就是通过索引取值,当列表为空时会返回一个NONE,所以在后续的操作可以判断obj是否为空。

      增:

      数据有两种方式可以增加:
      1.通过create函数:

    models.User.objects.create(username=username,password=password)

      create方法能够新增数据 并且有一个返回值。返回值就是新增的数据对象本身

      2.通过创建一个对象加保存的方法。

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

      推荐使用第一种方法,因为第二种方法效率太低

      删:  

      删除功能需要获取对象中的id,所以可以在删除按钮中添加id,后端可以通过GET方法取出:

    /del_user/?id={{ user.id }}

      然后删除:

    models.User.objects.filter(id=delete_id).delete() 
    # delete from user where id = delete_id;

      改:

      和删除功能差不多,需要获取修改id,然后再对其进行修改,其中注意的是:

      无论post和get都可以获取url后面的get请求。

      方法1:

    models.User.objects.filter(id=edit_id).update
    (username=username,password=password)
     filter拿到是一个列表,filter操作其实都是批量操作。

    如果filter结果列表中有多个数据,那么会一次性全部修改,类似于for循环一个个修改。

      方法2:

      对对象中的所有字段进行修改,然后保存(不推荐使用):

            edit_obj.username = username
            edit_obj.password = password
            edit_obj.save()

      第二种方式会从头到尾将所有的字段全部修改一遍 效率极低。

  • 相关阅读:
    算法与数据结构基础(一)排序基础1.选择排序
    Comparable和Comparator 是什么以及区别
    IE浏览器兼容性调整总结技巧
    css属性总结
    spring入门详细教程(五)
    Spring入门详细教程(一)
    Spring入门详细教程(四)
    2018年终总结(一只刚毕业的程序猿)
    Spring入门详细教程(三)
    Spring入门详细教程(二)
  • 原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11530762.html
Copyright © 2020-2023  润新知