Django第二天,必会知识点

Posted ludundun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django第二天,必会知识点相关的知识,希望对你有一定的参考价值。

静态文件配置*******
为什么用户在浏览器中输入的网址能够访问到对应的资源,
前提是后端提前开设该资源的访问,在urls.py文件中进行配置该路由,
如果我的后端没有开设相关的资源,用户是无法访问到的。

1.默认情况下所有的html文件都是放在templates文件夹内

2.什么是静态文件
网站所使用到的提前写好的css  js  第三方模块 图片都叫做静态资源

3.默认情况下网站所用到的静态文件资源全部放在static文件夹下。
通常情况下,在static文件夹内部还会再建其他文件夹
    css 文件夹
    js  文件夹
    font    文件夹
    img     文件夹
    为了更加方便的管理文件
django中,需要手动创建static文件夹





4.静态文件动态绑定----重点!!!
{%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>

5.   #访问静态资源文件接口前缀,通常情况下接口前缀的名字是static
STATIC_URL = '/xxx/'
#例如通过 http://127.0.0.1:8000/xxx/a.txt查找a.txt文件
#手动配置静态文件访问资源
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,'static')
    os.path.join(BASE_DIR,'static1')
    os.path.join(BASE_DIR,'static2')
 #多个配置文件,查找顺序,自上向下依次查找,找到就结束

]

6.
form表单默认是get请求
    get请求也能够携带参数
        http://127.0.0.1:8000/login/?username=jjjjksk & password=123
        特点:url?xxx=xxxx & yyyy=yyyy
        1.携带的数据不够安全
        2.携带的数据大小有限制 ,最大好像应该差不多是4kb左右
        3.通常只会携带一些不是很重要的数据


7.post请求会出现403,需要注释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',

]

8.
 <form action="" method="">默认处理的是get请求,
 get请求指向拿到login页面
 post请求向后端提交数据,然后后端做校验

 9.如何判断当前请求方式???
 request.method获取请求的方式
 拿到的是字符串大写的请求方式 GET  POST
     print(request.method,type(request.method))
     打印:GET <class 'str'>

 def login(request):

    # print('来了,小老弟')
    # print(request.method,type(request.method))

    if request.method=='post':
        print(request.method)
        return HttpResponse('昂首挺胸')

    print(request.method)
    return render(request,'login.html')

'''
视图函数都必须有返回值,
并且返回值都是HttpResponse对象

'''

10.request方法初始
    request.method 获取请求方式,并且纯大写的字符串

    print(request.POST)    获取用户提交的post请求数据
    如何获取用户数据*********
    request.POST.get() #默认只会获取列表最后一个元素
    request.POST.getlist()    #如果你想获取列表,用getlist()方法

    print(request.GET)    获取用户提交的GET请求数据
    如何获取用户数据*********
    request.GET.get() #默认只会获取列 表最后一个元素
    request.GET.getlist()    #如果你想获取列表,用getlist()方法

11.pycharm连接数据库,如果最右侧没有显示database的话,可以在settings中配置
settings --> Plugins  --> Database Tools and SQL(推荐右侧的全部勾选上)

12.django连接mysql***********
        必须要有两步操作
    1.在settings中找到DATABASES,然后把default中的配置修改为对应mysql的信息
      需要注意的是default中的key值都需要是全大写。

原始的    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

改后的    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'day49',
            'USER':'root',
            'PASSWORD':'root',
            'HOST':'127.0.0.1',
            'PORT':3306,
            'CHARSET':'utf8'

        }
    }

    2.主动告诉django 不要用默认的mysqldb连接,而是用pymysql
        你可以在项目名下的__init__.py中书写
        也可以在应用名下的__init__.py中书写
        书写内容是:
            import pymysql
            pymysql.install_as_MySQLdb()

13.django orm简介
    orm 对象关系映射
    类  ---  表
    对象  --- 数据
    对象.属性  ---  字段对应的值

    为什么使用orm?
        能够让不会数据库操作的人也能够简单方便去操作数据库
    orm的缺点:
        封装程度太高,有时候会出现查询效率偏低的问题
        所以工作中:
            简单的用orm
            复杂的追求速度的,需要你手动书写sql语句

14.django中如何操作orm?
    书写模型类
    去应用下的models.py中书写模型类

注意事项:
    之后在写django项目的时候,一个django项目对应一个数据库,
    不要出现多个项目使用同一个数据库的情况*************

15.*****************数据库迁移(同步)命令********************************
    1.python manage.py makemigrations  将数据库的修改,记录到migrations文件中

    2.python manage.py migrate     将修改操作真正的同步记录到数据库中

    注意事项:
        1.这两条命令是同步进行的,成双成对,缺一不可
        2.只要修改了models里面和数据库相关的代码,你就必须重新执行上面的两条命令

    个人建议:
        只要你离开了你的电脑,你就顺手锁屏,锁屏快捷键是  Windows+L  锁屏

*************************************************************************

16.模型表字段的增删改查
class User(models.Model):
    username = models.CharField(max_length=255)
    password = models.IntegerField()
    email = models.EmailField()

    注意事项:
        字段:email = models.EmailField()
    该字段需要设置默认值,或者该字段允许为空,两种方式需要选择一个
    方式1     设置默认值
    email = models.EmailField(default='123@qq.com')
    方式2     设置为空
    email = models.EmailField(null=True)
    注意:email虽然之前设置了默认值 default='123@qq.com' 后面又修改为 null=True,
    但是仍然对之前设置过的email字段没有任何影响的
    phone = models.BigIntegerField(null=True)
    方式3     直接根据他的提示设置默认值
    gender
    '''
    E:Python   jieshiqi11月份练习考试day50>python manage.py makemigrations

     1) Provide a one-off default now (will be set on all existing ro
    ws with a null value for this column)
     2) Quit, and let me add a default in models.py
    Select an option: 1     #######此处做出自己的选择,1设置默认值,2退出设置默认值
    Please enter the default value now, as valid Python
    The datetime and django.utils.timezone modules are available, so
    you can do e.g. timezone.now
    Type 'exit' to exit this prompt
    >>> 'male'  #######此处设置默认值,注意要有引号
    Migrations for 'app01':
      app01migrations005_auto_20191123_2054.py
        - Add field gender to user
        - Alter field email on user

    E:Python   jieshiqi11月份练习考试day50>python manage.py migrate

    ###不要忘记提交数据到数据库

    '''

    注意事项,字段的删除谨慎使用,因为对应字段都已经有了数据,删除后不可恢复(如同删库跑路)
    删除字段email、phone、gender:
    # email = models.EmailField(default='123@qq.com')
    # phone = models.BigIntegerField(null=True)
    # gender = models.CharField(max_length=64)
        删除字段的方法:
        直接注释对应字段的代码 +python manage.py makemigrations + python manage.py migrate

17.模型表数据的增删改查****************
查:
        data = models.User.objects.filter(username=username)
        print(data)         #<QuerySet [<User: User object>]>

        '''
        filter 返回的结果是一个列表,里面才是真正的数据对象
        filter 括号内可以放多个关键字参数,这多个关键字参数在查询的时候是and的关系不是or的关系
        '''
        user_list=models.User.objects.all() #查询出所有
        print(user_list)    #列表里面有4个对象<QuerySet [<User: User object>, <User: User object>, <User: User object>, <User: User object>]>
        #对象被打印会执行__str__方法
增:
    user_obj=models.User.objects.create(username=username,password=password)
    print(user_obj,user_obj.username,user_obj.password)
    #create方法会有一个返回值,返回值就是当前被创建的对象本身(如上面的user_obj)

改:

    #修改数据库中的数据
        #sql语句:update User set username='jsdnn',password='123' where id=1;
        models.User.objects.filter(id=edit_id).update(username=username,password=password)  #修改完毕
        '''
        上面的更新语句属于批量操作,会将filter查询出来的列表中所有的对象全部更新
        更新之后,重定向到用户列表页面

    由于更新重要,所以我拷贝了一份完整的代码,以供查阅
    def edit_user(request):
        '''
        返回编辑页面,编辑页面要含有用户的原来数据,提交后,保存数据到数据库
        问题:
        1.如何获取用户想要编辑的对应ID数据呢?
            利用get请求携带参数的方式,获取用户想要编辑的数据id值
            edit_id=request.GET.get('edit_id')
        2.如何查询出来要编辑的数据
            将用户想要编辑的数据查询出来,展示到编辑页面上,供用户修改
            edit_obj=models.User.objects.filter(id=edit_id)[0]  #支持索引取值,也支持切片操作,但是不支持负数
            edit_obj=models.User.objects.filter(id=edit_id).first()
            上面两行代码是同一个意思,查询出对应id的数据
            return render(request,'edit_user.html',{'edit_obj':edit_obj})

        :param request:
        :return:
        '''
        edit_id = request.GET.get('edit_id')
        if request.method == 'POST':
            username=request.POST.get('username')
            password=request.POST.get('password')
            #修改数据库中的数据
            #sql语句:update User set username='jsdnn',password='123' where id=1;
            models.User.objects.filter(id=edit_id).update(username=username,password=password)  #修改完毕
            '''
            上面的更新语句属于批量操作,会将filter查询出来的列表中所有的对象全部更新
            更新之后,重定向到用户列表页面

            '''

            return redirect('/userlist/')


        edit_obj = models.User.objects.filter(id=edit_id).first()
        return render(request,'edit_user.html',{'edit_obj':edit_obj})

删:
    #直接删除
    models.User.objects.filter(id=delete_id).delete()
    '''
        批量操作,会将filter查询出来的列表中所有的对象全部删除

    '''


注意事项:
    password = models.CharField(max_length=64)
修改字段类型以后,必须下面的password由整形修改为varchar类型,也是需要提交这两句命令的
python manage.py makemigrations
python manage.py migrate
然后数据库中的对应字段类型,才会从整形修改为字符串类型

以上是关于Django第二天,必会知识点的主要内容,如果未能解决你的问题,请参考以下文章

Django 第二天 创建Django项目

Django TodayArchiveView 显示第二天的日期

django之第二天

python学习第二天

Django 学习第二天

django第二天