静态文件和组件补充, ORM连接mysql

静态文件配置

1 在项目根目录下创建一个文件夹,名称随便,比如叫做xxx,用来存放我们的静态文件(js\css\图片文件等等)

2 在settings.py配置文件中写上如下内容

STATIC_URL = '/abc/'  #静态文件夹路径别名

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'xxxxx'),
]

 

3 使用静态文件配置路径

三种写法

1 <link rel="stylesheet" href="/abc/css/xx.css"> #直接使用静态文件夹路径别名
2 在html文件中{% load static %}
    使用:<link rel="stylesheet" href="{% static 'css/xx.css' %}"
3 在html文件中{% load static %}
    <link rel="stylesheet" href="{% get_static_prefix %}css/xx.css">

示例:

{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
      
{#    <link rel="stylesheet" href="/abc/css/xx.css">#}
{#    <link rel="stylesheet" href="{% static 'css/xx.css' %}">#}
    <link rel="stylesheet" href="{% get_static_prefix %}css/xx.css">
{#    <style>#}
{#        .c1{#}
{#            color:Red;#}
{#            font-size: 40px;#}
{#        }#}
{#        .c2{#}
{#            height: 100px;#}
{#            width: 100px;#}
{#            background-color: green;#}
{#        }#}
{#    </style>#}
</head>
<body>
<span class="c1">
    天气不好
</span>


<div class="c2" id="d2"></div>

<img src="/abc/imgs/timg.jpeg" alt="">


</body>
<script src="/abc/js/xx.js"></script>
{#<script>#}
{#    var divEle = document.getElementById('d2');#}
{#    divEle.onclick = function () {#}
{#        this.style.backgroundColor = 'blue';#}
{#    }#}
{##}
{#</script>#}
</html>

注意:如果有变量渲染, 就只能写在HTML文件里面. 因为加载顺序就是先读取HTML文件,那时候还是字符串,没有调用js代码,所以没法模板渲染,当读取完浏览器加载运行代码时候才发送调用js代码请求,这时候模板渲染那段时间早就过了,所以没成功渲染

多应用中的静态文件配置

可以在应用文件夹下创建一个static名称的文件夹,存放自己应用的静态文件
可以在应用文件夹下创建一个templates名称的文件夹,存放自己应用的html文件

django寻找html文件静态文件的查找顺序是
先找总配置中的templates或者statics文件夹,如果找不到对应文件,就去每个应用下的static或者templates去找对应文件,
顺序是按照settings.py配置文件中的INDSTALL_APP中注册app的顺序进行查找,找到就返回,不在继续往下找了,所以要注意,
最好在static或者templates下面创建一个以应用名为名称的文件夹,将文件放到这里面,以防文件名冲突导致的问题。

 

指令创建应用注意点

首先在项目根目录下执行以下指令

python manage.py startapp app01

然后在settings.py配置文件中的INSTALLED_APPS这一项配置列表里面,加上我们的应用名称。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 'app01.apps.App01Config', #全称
    'app01',  #简写
]


TEMPLATES 中 'DIRS': [os.path.join(BASE_DIR, 'templates')]也需手动加入

如果没有配置应用,那么在应用中写逻辑时,django框架提供的很多功能,是没办法调用的

凡是手动创建的应用,都需要在这里配置一下

 

ORM

object relational mapping,对象关系映射。主要完成的就是数据库操作。

  • MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动

  • ORM是“对象-关系-映射”的简称。(Object Relational Mapping,简称ORM)(将来会学一个sqlalchemy,是和他很像的,但是django的orm没有独立出来让别人去使用,虽然功能比sqlalchemy更强大,但是别人用不了)

  • 类对象--->sql--->pymysql--->mysql服务端--->磁盘,orm其实就是将类对象的语法翻译成sql语句的一个引擎,明白orm是什么了,剩下的就是怎么使用orm,怎么来写类对象关系语句。

总结

优点:
    开发效率高,应用程序开发程序员对类对象关系,比对sql语句要熟练一些
    迁移数据库时只需要修改配置,orm就能够帮我们将类对象关系翻译成对应数据库的sql语句
缺点:
    效率相对低,因为orm有一个翻译动作,现将orm语句翻译成sql语句,再去数据库里面执行,比直接写的原生sql语句多了一步翻译动作,所以效率相对低一些

创建表

在应用文件夹下的models.py文件中写上如下内容

class Book(models.Model):

    id = models.AutoField(primary_key=True) #自增、主键
    title = models.CharField(max_length=64,null=True) # null=True可为空
    state = models.BooleanField(default=True)  #default=True默认值
    pub_date = models.DateField()
    price = models.DecimalField(max_digits=20,decimal_places=5)
    publish = models.CharField(max_length=32)

对应的sql语句是这样的:
create table book(
    id int primary key auto_increment,
    title varchar(64),
    state boolean not null default true,
    pub_date date not null,
    price decimal(20,5) not null,
    publish varchar(32) not null
)

类写完之后,执行数据库同步(迁移)指令才能生成表

python manage.py makemigrations #在应用的migrations文件夹中生成迁移文件(也就是记录文件)
python manage.py migrate  #执行对应的记录文件,翻译成sql语句并到数据库中执行对应的sql来创建表

可以通过pycharm提供的数据库图形化界面工具来查看表名以及表结构。

 

 

 下载对应数据库的驱动程序,才能连接上对应数据库,才能在图形化界面中展示出对应数据库的表

 

添加字段,然后执行数据库同步指令时,可能会遇到的问题

You are trying to add a non-nullable field 'state' to book 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
Select an option: 

出现问题的原因就是,比如新增的state属性对应的字段,默认是不能为空的,如果我们没有设置它可以为空,或者没有给它设置默认值,那么如果数据表中有了几行数据,那么这几行中的新增的这里一列数据,就没办法自动添加数据,orm不知道给你添什么数据,所以遇到了上面的报错情况,上面的报错请求就是告诉你,给新添加的字段添加上默认值,或者设置可以为空才行。

解决办法

1 直接在提示信息的这个位置Select an option: 输入默认值,然后回车
2 退出窗口,在state = models.BooleanField(null=True) 或者state = models.BooleanField(default='默认值'),然后在执行数据库同步指令

 

配置连接mysql数据库

第一步: 去mysql里面创建一个库

mysql> create database orm01 default charset=utf8mb4;

第二步:将settings.py配置文件中的DATABASES配置改成如下内容

#完整连接数据库的指令:mysql -h 127.0.0.1 -P 3306 -u root -p666
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'orm01',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'USER':'root',
        'PASSWORD':'666'
    }
}
#注意:字典中的每一项名称都是固定写法,并且必须都是大写

第三步:指定django连接mysql的python模块

1 下载pymysql
    pip install pymysql

2 指定连接模块,需要在项目主目录下的__init__.py文件中来指定,内容如下
    import pymysql
    pymysql.install_as_MySQLdb()

第四步:执行数据库同步指令(此时mysql中没有我们创建的表)

python manage.py makemigrations
python manage.py migrate

通过pycharm提供的操作数据库的图形界面工具来连接一下mysql

 

如果连接不上,换成for5.1的驱动:

看一下数据库同步指令执行顺序,

 

 

有的时候字段出现错误而migrations无法解决时, 可以直接修改项目文件夹下migrations文件里存放的相应文件里的内容, 然后再执行migrations

 

 

 这个时候如果无法解决, 可以将这一列删掉,再重新添加

 

 

模板渲染补充(组件)

组件

组件就是一个html文件,其中封装了一些特定功能,比如就是一个导航栏,或者就是一个左侧菜单,相当我们将一些特定功能封装成了一个组件,将来任何其他html文件中如果使用这部分功能,可以直接引入使用。

在django模板渲染系统中使用组件的步骤

第一步:创建组件的html文件,名字随便取,比如叫做zujian.html,比如内容如下,做一个顶部导航栏组件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>zujian</title>
    <style>
        .nav{
            background-color: blue;
            height: 100px;
        }
        .nav a{
            color:white;

        }
    </style>
</head>
<body>

<div class="nav">
    <a href="">百度</a>
    <a href="">京东</a>
    <a href="">个人中心</a>
</div>


</body>

</html>

第二步:使用组件,需要借助下面这个标签语法

{% include '组件文件名称.html' %}

示例:比如我们需要某个html文件中使用,比如show.html文件中使用,show.html文件内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
{#    <style>#}
{#        .nav{#}  <!-- 可以修改样式,但是注意权重问题 -->
{#            background-color: yellow!important;#}
{#        }#}
{#    </style>#}
</head>
<body>

<h1>这是show页面</h1> 
{% include 'zujian.html' %}  <!-- 在哪里引入组件,组件就生成在页面的对应位置上 -->
</body>

</html>

Inclusion_tag 自定义标签

动态组件的应用

注意:在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的标签

  1、在app中创建templatetags文件夹(文件夹名只能是templatetags)

  2、在templatetags文件夹中创建任意 .py 文件,如:mytag.py

3、在mytag.py文件中写上如下内容

from django import template
register = template.Library() #制作注册器,名字必须叫register
@register.inclusion_tag('zujian2.html')
def xiaolin(v1):
    #v1 = [11,22,33]
    return {'data': v1}

4、 使用inclusion_tag,比如在show2.html文件中使用:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% load mytag %}
{% xiaolin d %}

<h1>这是show2页面</h1>
</body>

</html>

5、需要后台给show2.html传递数据,比如views.py文件写法如下

def show2(request):
    d = ['晴天', '雨天', '阴天']
    return render(request,'show2.html',{'d': d})

inclusion_tag的加载流程,如图:

 

posted on 2020-07-15 23:35  fdsimin  阅读(138)  评论(0编辑  收藏  举报