Django框架及ORM的基本使用

一、小白必会三板斧

首先在views.py文件中导入模块:from django.shortcuts import render,HttpResponse,redirect

1.1 HttpResponse

HttpResponse:返回字符串

# 1. 首先在urls.py配置请求路径
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^httpresponse/', views.httpresponse),
]

# 2. 编写对应函数
def httpresponse(request):
    return HttpResponse("我是HttpResponse")

# 3. 浏览器中请求
http://127.0.0.1:8000/httpresponse

我是HttpResponse

1.2 render

render:返回html页面

# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^httpresponse/', views.httpresponse),
    url(r'^renders/', views.renders),
]


# 2. 编写对应函数
def renders(request):
    return render(request, "02render.html")

# 3. 浏览器中请求
http://127.0.0.1:8000/renders

我是render

1.2.1 向前端页面传值的两种方式

  1. 在html中通过字典获取后台数据
<!--02render.html-->
<!DOCTYPE html>

<body>
<h1>我是render</h1>
{{ user }}
</body>
</html>
# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^httpresponse/', views.httpresponse),
    url(r'^renders/', views.renders),
]


# 2. 编写对应函数
def renders(request):
    user_info = {"user": "randy", 'age': 18}
    # 注意:只能返回的是字典数据类型,其他数据类型则会报错
    return render(request, "02render.html", {'user': user_info})
# 3. 浏览器中请求
http://127.0.0.1:8000/renders

我是render

{"user": "randy", 'age': 18}

  1. locals获取所有局部变量
<!--02render.html-->
<body>
{{ user_info }}<br>
locals可以获取当前所有局部变量:{{ num }} <br>
locals可以获取当前所有局部变量:{{ count }} <br>
</body>
</html>
# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^httpresponse/', views.httpresponse),
    url(r'^renders/', views.renders),
]

# 2. 编写对应函数
def renders(request):
    user_info = {"user": "randy", 'age': 18}   
    num=123
    count = 890
    # locals返回全部局部变量
    return render(request, "02render.html", locals())
# 3. 浏览器中请求
http://127.0.0.1:8000/renders

{'user': 'randy', 'age': 18}
locals可以获取当前所有局部变量:123
locals可以获取当前所有局部变量:890

1.2.2 获取后台数据的两种方式的比较

  • 通过字典的方式:当传送多个数据编写困难,相对于locals效率高些
  • 通过locals方式:会把前名称空间中所有变量全部传送到页面中,效率相对字典低

1.3. redirect

redirect:重定向

# 1. 首先在urls.py配置请求路径
from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^httpresponse/', views.httpresponse),
    url(r'^renders/', views.renders),
    url(r'^redirects/', views.redirects),
]

# 2. 编写对应函数

def redirects(request):
    print(request)
    # return redirect('/index') # 重定向指定的路径
    return redirect("https://www.baidu.com") # 重定向到指定的url
# 3. 浏览器中请求
http://127.0.0.1:8000/redirects  # 进入百度页面

二、 静态文件配置

引用css,js,第三方框架的时候,需要配置静态文件,否则页面将没有被渲染

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!--static不是文件,是静态资源访问的接口-->
    <script src="/static/bootstrap/js/jquery.js"></script>
    <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css">
    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<h1>static</h1>
</body>
</html>

通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下,并且需要在setttings.py 中 手动配置静态文件访问的资源,如下

STATIC_URL = '/static/'  # 是访问静态资源的接口前缀
"""只要你想访问静态资源 你就必须以static开头"""

# settings.py配置,名字不可以更改
 STATICFILES_DIRS = [
     	# 添加静态文件可以添加多个,拼接文件夹的路径
        os.path.join(BASE_DIR,'static'),
        os.path.join(BASE_DIR,'static1'),
        # os.path.join(BASE_DIR,'static2'),
    ]

注意:STATIC_URL = '/static/' 是访问静态资源的接口前缀中 static 并不是你创建文件夹的名称,而是一个静态资源访问接口,名字是可以改变的,为避免修改static的修改,在引用js,css可以动态设置

2.1 静态文件 动态解析

{% load static %}
<link rel="stylesheet" href="{% static '/bootstrap/css/bootstrap.css' %}">
<script src="{% static '/bootstrap/js/bootstrap.min.js' %}"></script>

三、 form表单

from表单默认项后台提交的方式默认为get请求,get请求携带带参数的方式是在url的后面url?username=admin&password=213213213213213, 从而导致提交数据不安全,并且它携带的杉树大小有限制,一般采用post请求

# 采用post请求暂且要注释一个中间件
    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',
        ]

3.1 form表单 action参数书写的形式

  • 不写默认提交地址为当前页面
  • 只写请求地址后缀(/index)
  • 写全路径

3.2 request对象及方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% load static %}
    <script src="{% static 'bootstrap/js/jquery.js' %}"></script>
    <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
    <script src="{% static 'bootstrap/js/bootstrap.js' %}"></script>
</head>
<body>
<form action="" method="post">
    <div class="container">
        <div class="row">
            <div class="col-md-6 col-md-offset-2 ">
                <h1 class="text-center">登录界面</h1>
                <input type="text" class="form-control" name="username"><br>
                <input type="password" class="form-control" name="password"><br>
                <input type="checkbox" name="hobby" value="backbll"> 篮球
                <input type="checkbox" name="hobby" value="xiaoball"> 小球
                <input type="checkbox" name="hobby" value="daball"> 打球<br>
                <input type="submit" class="btn btn-primary"><br>
            </div>
        </div>
    </div>
</form>
</body>
</html>
def login(request):
    # request 请求的内容
	# request.method  请求方式
    if request.method == 'POST':
        # 获取前端传递过来的用户名和密码
        print(request.POST)  # post请求提交过来的数据  <QueryDict: {'username': ['admin'], 'password': ['123']}>
        
        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()
        """
    return render(request, 'login.html')

3.2.1 获取请求方式

根据获取不同的请求方式,进行不同的逻辑出来,默认为GET请求··

request.method  # GET / POST, <class 'str'>

3.2.2 获取前端提交数据

request.POST.get("") 如果有多个数据列表比如爱好,只会获取最后一个爱好,所以他只能获取一个值,

request.POST.getlist("") 可以获取多个值,返回一个列表

post请求提交过来的数据 <QueryDict: {'username': ['admin'], 'password': ['123']}>

username = request.POST.get("username")
password = request.POST.get("password")

四、django连接数据库

  • pycharm连接数据库

pycharm连接数据库 数据库可能会导致连接不上,是因为jdbc版本从而导致的,可以更改驱动版本,获奖数据库系统时间SYSTEM更该为 +8:00

  • django连接数据库
  1. 在settings.py中配置数据库连接
  2. 在--init--.py中更改数据库连接的方式
# 第一步配置文件中配置
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语句

注意事项:django的orm不会自动帮你创建库,库需要你自己手动创建,表会自动帮你创建 你只需要书写符合django orm语法的代码即可,去应用下所在的models.py中书写类

5.1 创建表

当django连接数据库配置好后,需要从创建表开始做和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)  # 新增的字段 可以设置为空

5.2 数据库迁移命令

python manage.py makemigrations  # 初始化表,会在migrations文件夹中创建0001——initila.py,创建一条记录
python manage.py migrate

第一步:在models.py中创建与之对应的表类,(如果没有指定id,他会自动创建一个id为主键,并且id只能用于主键,)

第二步: 使用 python manage.py makemigrations 执行该命令会在migrations文件夹中产生0001__initial.py文件,同时会产生一条记录,数据库中并没有创建真实的数据库,

第三步: 使用python manage.py migrate. 执行该命令会真实创建用户信息表,第一次创建,Django也会创建其他的数据库

注意:一旦 你在models.py中修改了跟数据库相关的代码 你就必须重新开始执行上面两条命令

  • 如果想要修改字段,可以在创建类中进行修改慎重,重新之中上面的两条命令

5.3 ORM操作数据库(重点)

# 推荐使用的ORM中对数据的增删改查的语句

# 增: 推荐方式
models.User.objects.create(usr=my_usr, pwd=my_pwd)

# 删: 推荐方式
models.User.objects.filter(usr=my_usr).delete()

# 改: 推荐方式
models.User.objects.filter(usr=my_usr).update(pwd=new_pwd)

# 查: 推荐方式
models.User.objects.filter(usr=my_usr, pwd=my_pwd)

下面演示ORM操作数据库的其他方法:

查询数据:

# 查询数据
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)  # 查:get(查询条件)

        # 2.filter()   当查询条件不存在时,不会报错而是返回空列表,条件存在返回列表套对象
        # filter可以当多个查询条件 并且是and关系
        res = models.Userinfo.objects.filter(username=username) # 查:filter(多个查询条件)
        user_obj = res.first()  # 取queryset第一个元素
        
        # 3.all()	查询全部记录

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

注意:使用get条件查询,查不到数据就会报错,尽量使用filter查询数据

插入数据:

# 插入数据
def reg(request):
    if request.method == 'POST':
        username = request.POST.get("username")
        password = request.POST.get("password")
        
        # 方式1:create方式,返回当前被创建的数据对象,推荐使用
        user_obj = models.Userinfo.objects.create(username=username,password=password)
        print(user_obj)
        
        # 方式2:实例化对象在Save方式,不推荐
        user_obj = models.Userinfo(username=username,password=password)
        user_obj.save()
        
    return render(request,'register.html')

修改数据:

def edit_user(request):
    edit_id = request.GET.get('edit_id')
    if request.method == 'POST':
        username = request.POST.get("username")
        password = request.POST.get("password")
        """POST中也是可以获取GET请求携带的参数"""
        
        # 修改数据方式1:	# 批量更新
        models.Userinfo.objects.filter(pk=edit_id).update(username=username,password=password)
        # 修改数据方式2:
        edit_obj = models.Userinfo.objects.filter(pk=edit_id).first()
        edit_obj.username = username
        edit_obj.save()
        return render(request,'edit_user.html',locals())

删除数据:

删除一般要小心使用,正常工作并没有删除的需求

def delete_user(request):
    delete_id = request.GET.get('delete_id')
    models.Userinfo.objects.filter(pk=delete_id).delete()  # 批量删除
    return redirect('/userlist')

原文地址:https://www.cnblogs.com/XuChengNotes/p/11721637.html