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()

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

原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11530762.html