zoukankan      html  css  js  c++  java
  • day 57 三板斧(httpresponse,render,redirect),静态文件配置,form表单提交数据,request对象及方法,django连接数据库,django orm简介,字段的增删改查,数据的增删查改

    httpresponse,render,redirect

      #httpresponse,返回字符串

    def login(request):
    return HttpResponse('hello baby~')

    #render,返回html页面
     def reg(request):
    user_dict = {'name':'jason','pwd':123}
    return render(request,'reg.html')

    #给模板传值的方式1,直接使用字典
    return render(request, 'reg.html',{'xxx':user_dict}) # 将user_dict传递给reg.html页面 页面上通过xxx就能够获取到该字典
    #给模板传值的方式2,使用locals
    return render(request,'reg.html',locals()) # 会将当前名称空间中所有的变量名全部传递给reg.html页面
    但是,会出现效率问题


    #redirect,重定向
     def home(request):
    # return redirect('/index')
    return redirect('http://www.xiaohuar.com')
    
    

    静态文件配置

    #静态文件
    网站所用到的
    自己写好js
    自己写好css
    第三方的框架 bootstrap fontwesome sweetalert

    通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下
    STATIC_URL = '/static/' # 是访问静态资源的接口前缀,前缀可以修改,html页面需要跟着修改路径
    """只要你想访问静态资源 你就必须以static开头"""
    # settings.py手动配置静态文件访问资源
    STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
    os.path.join(BASE_DIR,'static1'),
    # os.path.join(BASE_DIR,'static2'),
    ]

    #接口前缀 动态解析,不用因为静态资源的接口前缀改变而改变路径
    {% load static %}
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.min.js' %}"></script>

     

     

    form表单提交数据

    form表单 action参数可以写的形式
    1.不写 默认朝当前地址提交
    2.只写后缀/index/
    3.写全路径

    form表单默认朝后端提交的方式 默认是get请求
    get请求携带参数的方式 是在url“?”后面,例如:url?username=admin&password=21321321


    缺点:
    1.不安全
    2.get请求携带的参数有大小限制(最大不能超过4KB左右)

    <form action="" method="post">
    username:<input type="text" class="form-control" name="username">
    {# username1:<input type="text" class="form-control" name="username">#}
    <!--这是原生的html注释-->
    {# 这是模板语法的注释#} #区别是模版语法的注释,不会再网页的html中显示
    password:<input type="password" class="form-control" name="password">
    {# hobby:#}
    {# <input type="checkbox" name="hobby" value="basketball">篮球#}
    {# <input type="checkbox" name="hobby" value="football">足球#}
    {# <input type="checkbox" name="hobby" value="doublecolorball">双色球#}
    <br>
    <input type="submit" class="btn btn-primary">
    </form>


    前期你如果要提交post请求 你就去settings.py文件注释掉一个中间件
    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 对象及方法

    #前后端数据交互,获取请求方式

    request.method

    #获取post请求携带的数据
    request.POST
    #获取get请求携带的数据
    request.GET


    get和post在后端获取用户数据的时候 规律是一样的
    <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
    tank <class 'str'>
    123 <class 'str'>
    request.POST.get('username') 默认只取列列表的最后一个元素
    如果你想将列表完整的取出 你必须用getlist()

     def login(request):
    # if request.method == 'GET':
    # # 你应该针对不同的请求方式 有不同的处理逻辑
    # # print('走了我')
    # # 获取请求方式 结果是一个大写的字符串
    # print(request.method,type(request.method))
    # return render(request,'login.html')
    # elif request.method == 'POST':
    # pass
    """由于get请求比较常见 并且业务逻辑简单 所以针对get不需要做逻辑判断 默认就是get请求"""
    if request.method == 'POST':
    # 获取前端传递过来的用户名和密码
    print(request.POST) # post请求提交过来的数据 <QueryDict: {'username': ['admin'], 'password': ['123']}>
    # 你可以直接将request.POST当成字典即可
    username = request.POST.get('username')
    password = request.POST.get('password')
    hobby = request.POST.getlist('hobby')
    print(username,type(username))
    print(password,type(password))
    print(hobby,type(hobby))
    """
    <QueryDict: {'username': ['admin', 'tank'], 'password': ['123']}>
    tank <class 'str'>
    123 <class 'str'>
    request.POST.get('username') 默认只取列列表的最后一个元素
    如果你想将列表完整的取出 你必须用getlist()
    """
    # print(request.GET)
    # username = request.GET.get('username')
    # password = request.GET.get('password')
    # hobby = request.GET.getlist('hobby')
    # print(username, type(username))
    # print(password, type(password))
    # print(hobby, type(hobby))

    return render(request, 'login.html')

     

    django链接数据库

    #第一步配置文件中配置
    DATABASES = {
      'default': {
        'ENGINE': 'django.db.backends.mysql', # 指定数据库 MySQL postgreSQL
        'NAME': 'day56', # 到底使用哪个库
        'USER':'root',
        'PASSWORD':'root',
        'HOST':'127.0.0.1',
        'PORT':3306,
        'CHARSET':'utf8'
        }
      }

    #第二步
    django默认使用的是mysqldb连接数据库 但是该模块不支持了
    所以你要告诉django不要用mysqldb该用pymysql连接

    你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
    import pymysql
    pymysql.install_as_MySQLdb()

     

     

    django orm简介
    orm对象关系映射:
    类 -->数据库的表
    对象 -->表的记录
    对象获取属性 -->记录的某个字段对应的值

    优点:  能够让一个不会数据库操作的人 也能够简单快捷去使用数据库
    缺点:  由于封装程度太高 可能会导致程序的执行效率偏低有时候 结合项目需求 可能需要手写sql语句

    #注意事项:
    1.django的orm不会自动帮你创建库,库需要你自己手动创建,表会自动帮你创建 你只需要书写符合django orm语法的代码即可

    去应用下所在的models.py中书写类
    from django.db import models

    # Create your models here.
    class Userinfo(models.Model):
      # 设置id字段为userinfo表的主键 id int primary key auto_increment
      id = models.AutoField(primary_key=True) # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
      # 设置username字段 username varchar(64) CharField必须要指定max_length参数
      username = models.CharField(max_length=64) # 在django orm中 没有char字段 但是django 暴露给用户 可以自定义char字段
      # 设置password字段 password int
      password = models.IntegerField()
    ******************************数据库迁移(同步)命令***********************************
    python manage.py makemigrations # 不会创建表 仅仅是生成一个记录 将你当前的操作记录到一个小本本上(migrations文件夹)
    python manage.py migrate # 将你的orm语句真正的迁移到(同步)到数据库中
    #只要你在models.py中修改了跟数据库相关的代码 你就必须重新开始执行上面两条命令

     

     

    字段的增删改查

    class Userinfo(models.Model):
    # 设置id字段为userinfo表的主键 id int primary key auto_increment
    id = models.AutoField(primary_key=True) # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
    # 设置username字段 username varchar(64) CharField必须要指i定max_length参数
    username = models.CharField(max_length=32) # 在django orm中 没有char字段 但是django 暴露给用户 可以自定义char字段
    # 设置password字段 password int
    password = models.IntegerField()
    # phone = models.BigIntegerField(default=110) # 新增的字段 可以提前设置默认值
    # addr = models.CharField(max_length=64,null=True) # 新增的字段 可以设置为空
    #删除字段就是将相应字段的代码去掉,更新数据库,最好不要使用会造成数据丢失
    #修改字段就是修改相应的字段代码,更新数据库

     

    数据的增删改查

    def login(request):
    if request.method == 'POST':
    username = request.POST.get("username")
    password = request.POST.get("password")
    # 先以用户名为依据查询数据
    # 1.get() #当查询条件不存在的时候 会直接报错 如果存在会直接给你返回 数据对象本身 不推荐使用
    # res = models.Userinfo.objects.get(username=username) # select id,username,password from userinfo where username='jason'
    # print(res)
    # print(res.username)
    # print(res.password)
    # 2.filter() 当查询条件不存在的时候 不会报错而是返回一个空
    # 当条件存在的情况下 无论数据有几条返回的都是列表套对象的数据格式
    # filter可以当多个查询条件 并且是and关系
    res = models.Userinfo.objects.filter(username=username) # select * from userinfo where username='jason' and password=123;
    # user_obj = res[0]
    # user_obj = res[0:3]
    # user_obj = res[-1] # 可以将filter查询出来的结果当做列表去对待 支持正数的索引取值和切片 不支持负数
    user_obj = res.first() # 取queryset第一个元素
    print(user_obj)
    return render(request,'login.html')


    def reg(request):
    if request.method == 'POST':
    username = request.POST.get("username")
    password = request.POST.get("password")
    # 直接将用户名和密码写入数据库
    user_obj = models.Userinfo.objects.create(username=username,password=password)
    # insert into userinfo(username,password) values('admin','666');
    # create方法会有一个返回值 返回值就是当前被创建的数据对象
    print(user_obj)
    return render(request,'register.html')

     

     

    def userlist(request):
    # 获取用户表中的所有的数据
    user_queryset = models.Userinfo.objects.all() # 结果类似于列表套数据对象 里面是当前表的所有数据对象
    # print(user_queryset.query) # 只有queryset对象才能够点query查询内部所对应的sql语句
    # print(user_queryset)
    # 将数据传递给前端页面展示给用户看
    return render(request,'userlist.html',locals())

     

     

    def edit_user(request):
    # 1.如何获取用户想要编辑的数据
    edit_id = request.GET.get('edit_id')
    if request.method == 'POST':
    # 将用户新修改的所有的数据
    username = request.POST.get("username")
    password = request.POST.get("password")
    """POST中也是可以获取GET请求携带的参数,也就是拿“url”?后面的数据"""
    # 去数据库中修改对应的数据
    # 方式1:
    models.Userinfo.objects.filter(pk=edit_id).update(username=username,password=password) # 批量更新
    # 方式2: 获取当前数据对象 然后利用对象点属性的方式 先修改数据 然后调用对象方法保存
    # 不推荐你使用第二种方式 效率低 挨个重新写入一遍
    # edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk能够自动帮你查询出当前表的主键字段名
    # edit_obj.username = username
    # edit_obj.password = password
    # edit_obj.save()
    """update方法会将filter查询出来的queryset对象中所有的数据对象全部更新"""
    # 跳转到数据展示页面
    return redirect('/userlist')
    # 2.根据主键值去数据库中查询出当前对象 展示给用户看
    edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk能够自动帮你查询出当前表的主键字段名
    # 3.将查询出来的数据对象传递给前端页面 展示给用户看
    return render(request,'edit_user.html',locals())

    def delete_user(request):
    # 获取想要删除的数据id 直接删除
    delete_id = request.GET.get('delete_id')
    models.Userinfo.objects.filter(pk=delete_id).delete() # 批量删除
    return redirect('/userlist')

     

     

    
    


     






     

     

     

  • 相关阅读:
    「B/S端开发」如何将DevExtreme组件添加到React应用程序?
    完整UI组件库Kendo UI for Vue R3 2021
    DevExpress WPF界面控件
    DevExpress WinForm MVVM数据和属性绑定指南(Part 1)
    界面控件Telerik UI for WinForm初级教程
    ua-parser-js 实现获取浏览器信息和操作系统信息
    vue--axios 拦截器的简单介绍及使用场景
    css 插件
    去除List集合中的重复值(四种好用的方法)
    常州大学/企业微信/电费查询脚本
  • 原文地址:https://www.cnblogs.com/wwei4332/p/11715206.html
Copyright © 2011-2022 走看看