zoukankan      html  css  js  c++  java
  • Django其二

    一、静态文件:

      1、静态文件夹的创建:在项目总目录下手动新建一个static文件夹(非限定名称,约定如此),后续项目需要用到的静态文件都存于该文件夹内,其中可以再划分多个子文件夹来更方便管理这些静态文件。

        ①js文件夹:存放网页设计时已写好的js文件。

        ②css文件夹:存放网页设计时已写好的css文件。

        ③img文件夹:存放网页设计时用的图片文件。

        ④其他其他第三方框架文件。

      2、静态文件的配置:

        ①settings.py中的<STATIC_URL = '/static/'>:这条是默认配置,此处的'static'并非'static文件夹',是所有静态文件的路由前缀,可修改为其他的,若修改,相应的静态文件的加载路径也需要改变。

        ②在setting.py中书写上:

          STATICFILES_DIRS = [

            os.path.join(BASE_DIR, 'static'

            os.path.join(BASE_DIR, 'static1'

            os.path.join(BASE_DIR, 'static2' 

          ]

        ---②此处的'static'/'static1'/'static2'则是代表静态文件的文件夹了,所以静态文件的文件夹可以有多个,只要加入这项配置后,这些文件夹下面的静态文件都可以通过加上路由前缀'static'被访问到。

      3、静态文件的加载路径会随<STATIC_URL = '/static/'>的修改而改变,基于此,Django提供了动态解析方案,需要在html文件的head内书写上如下语句:

      {% load static %}

      <link rel="stylesheet" href="{% static <css文件的相对url> %}">

      <script src="{% static <js文件的相对url> %}"></script>

    二、form表单请求数据相关

      1、action参数:数据提交处。

        ①不写,则默认还是跳转当前页面(相当于刷新),并把数据提交给当前页面。

        ②写全url,定向跳转,并提交数据。

        ③只写后缀,会补全IP与端口,跳转到同站其他页面,并提交数据。

      2、method参数:数据提交的方式。

        ①不作声明:以默认的'get'方式。

        ②如改为'post',需要将setting.py中的MIDDLEWARE里面的'django.middleware.csrf.CsrfViewMiddleware'注释掉后,'post'方式才可生效。

    三、request对象初认:任何形式访问任一页面都会在页面的视图层生成request对象。

      1、request.method:返回请求方式,全大写的字符串形式,可以基于此结果执行不同的代码。

      2、request.POST系列:

        ①request.POST.get():name/value的字典,若value为多值项,只会获得最后一项的value。

        ②request.POST.getlist():其余与上一条一样,若value为多值项,会获得多值组成的列表。

      3、request.GET系列:

        ①request.GET.get():与'request.POST.get()'的用法基本一致。

        ②request.GET.getlist():与'request.POST.getlist()'的用法基本一致。

      4、request.GET与request.POST相比,前者携带数据的大小有限制,只有几KB,后者没有限制。

    四、pycharm连接数据库MySQL

      1、三个位置查找呼出按钮:

        ①两侧快捷框的右上方。

        ②左下角更多快捷项。

        ③Settings ===> Plugis里面安装相应插件。

      2、连接数据库之前需要先选择合适的驱动,并安装好。

      3、用pycharm只能操作已有库,若需新建,还得先通过其他途径创建。

    五、Django连接数据库MySQL

      1、修改默认配置的sqlite3,将settings.py里面的DATABASES改为:

        DATABASES = {

          'defaulit' = {

            'ENGINE': 'django.db.backends.mysql',

            'NAME': '<库名>',

            'USER': 'root',

            'PASSWORD': '<密码>',

            'HOST': '127.0.0.1',

            'PORT': 3306,

            'CHARSET': 'utf8'

          }

        }

      2、Django默认用的是mysqldb模块连接MySQL,该模块的兼容性不好,需要手动改为pymysql模块,在主文件夹下面或者任意一个app文件夹下面的__init__.py文件中书写上:

        import pymysql

        pymysql.install_as_MySQLdb()

    六、ORM基础

      1、简述:ORM即对象关系映射,能够把sql语句通过python的操作对象语法实现来操作数据库。

      2、不足:封装程度太高,有时候通过ORM语法执行的效率偏低,此时则还需要用回原生的sql语句。

      3、在model.py里面书写类相当于创建了表。

      4、对应关系:

        ①类 <===> 表。

        ②对象 <===> 一行具体记录。

        ③对象属性 <===> 具体记录的某个字段的值。

      5、表的创建与字段的增改删:无论何种操作,新建表或对表的结构进行了修改,都需要执行下面的数据迁移指令才能生效:

        python manage.py makemigrations---将操作记录在数据迁徙文件夹migrations中

        python manage.py migrate---将操作真正地同步到数据库

        ①创建表:

    class Student(models.Model):  # 必须继承 models.Model
        # 声明主键,并声明自增
        # 若不定义主键,ORM会自定创建一个名为 id 的主键字段
        # 基于上一条,当主键无需特定名称时,可省略本条语句
        # verbose_name 是对本条字段的描述
        id = models.AutoField(primary_key=True, verbose_name='主键')
        # CharField 相当于 varchar,必须制定长度
        student_name = models.CharField(max_length=32, verbose_name='学生姓名')
        # IntegerField 相当于 int
        student_age = models.IntegerField(verbose_name='学生年龄')

        ②增加字段:

        # 声明本字段的值可以为 null
        student_skill = models.CharField(max_length=32, verbose_name='学生特长', null=True)
        # 声明本字段的默认值为'study'
        student_hobby = models.CharField(max_length=32, verbose_name='学生爱好', default='study')
        # 新增字段若既没有声明可以为 null,也没有声明默认值,会在终端进行询问---是否给已有记录统一设置某值或设置为null或另行设置
        student_addr = models.CharField(max_length=32, verbose_name='学生地址')

        ③修改字段:直接修改原语句后执行两句数据迁移指定即可。

        ④删除字段:直接删除或注释原语句后执行两句数据迁移指定即可,因为如此操作后字段的值也相应被删除了,所有要慎用。

      6、记录的查增改删:

        ①查看记录:

    def select_db(request):
        # filter可以看成是检索条件,后面可以声明多个参数,多个参数之间默认是 and 的关系,括号里面什么都不写,代表查所有数据
        # 返回值是数据对象组成的列表,列表可以索引取值,可以切片,不支持负数号索引
        student_obj_list = models.Student.objects.filter(student_name='tom')
        # .first() 相当于 [0] 索引
        student_obj_1 = student_obj_list.first()
        # 拿到具体数据对象,可以查看指定字段的值
        print(student_obj_1.student_name)
        # 查所有数据
        student_obj_all_list = models.Student.objects.all()

        ②增加记录:

    def add_db(request):
        # 本条语句新增记录的同时会返回该数据对象
        student_obj_2 = models.Student.objects.create(student_name='pik', student_age=19)
        print(student_obj_2.student_age)

        ③增加记录方法二:

    def add_db_2(request):
        # 先生成数据对象,再保存
        student_obj_3 = models.Student(student_name='sara', student_age=19)
        student_obj_3.save()
        print(student_obj_3.student_hobby)

         ④修改记录:

    def modify_db(request):
        # 将数据对象列表中所有元素统一修改,也可以用.first()先取出来再修改
        student_obj_4 = models.Student.objects.filer(id = 1)
        student_obj_4.update(student_name = 'bob')

         ⑤修改记录方法二:

    def modify_db_2(request):
        # 先拿出数据对象,用对象方法修改属性,再保存,也是默认批量,单独拿出才是单个修改
        # 该方法会将所有字段,无论是否是修改的字段,都更新一遍
        # 所以当字段较多时,效率比较低
        student_obj_5 = models.Student.objects.filer(id = 1)
        student_obj_5.student_name = 'bob'
        student_obj_5.save()

        ⑥删除记录:

    def delete_db(request):
        # 跟修改一样,可以批量可以单个
        student_obj_6 = models.Student.objects.filer(id = 1)
        student_obj_6.delete()
  • 相关阅读:
    C++_构造函数与析构函数
    华为模拟机试_C++题解
    OOP_由C到C++
    OOP_面向对象程序设计概述
    java ssm 后台框架平台 项目源码 websocket即时聊天发图片文字 好友群组 SSM源码
    springmvc SSM 多数据源 shiro redis 后台框架 整合
    【面经】5年Java面试亲身经验
    【快手初面】要求3个线程按顺序循环执行,如循环打印A,B,C
    手工实现HttpBasic校验
    Java 并发系列(一) ThreadPoolExecutor源码解析及理解
  • 原文地址:https://www.cnblogs.com/caoyu080202201/p/12961804.html
Copyright © 2011-2022 走看看