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()
原文地址:https://www.cnblogs.com/caoyu080202201/p/12961804.html