django的下载与使用

下载安装

  1. 命令行

    pip3 install django==1.11.23 -i https://pypi.tuna.tsinghua.edu.cn/simple

  2. pycharm

    file -- > settings --> Project Interpreter --> + --> 选择响应的版本下载

创建项目

  1. 命令行

    先建立好本地文件夹,然后再本文件夹下执行django-admin startproject 项目名称

  2. pycharm

    flie ---> new_project ---> django --->项目路径 --->选解释器

目录说明

 mysite/
 ├── manage.py  # 管理文件,整个Django项目的启动文件
 └── mysite  # 项目目录
    ├── __init__.py
    ├── settings.py  # 配置
    ├── urls.py  # 路由 --> URL和函数的对应关系
    └── wsgi.py  # runserver命令就使用wsgiref模块做简单的web server

启动项目

  1. 命令行

    ** 切换到项目根目录  **
    
    python manage.py runserver # 127.0.0.1:8000  默认
    
    python manage.py runserver 80 # 127.0.0.1:80  修改端口
    
    python manage.py runserver 0.0.0.0:80 # 0.0.0.0:80 修改IP和端口允许所有主机通过80端口进行访问
  2. pycharm

    点绿三角启动带有dj标记的项目,不是简单的右键运行文件

三件套

导入

from django.shortcuts import HttpResponse, render, redirect

HttpResponse

内部传入一个字符串参数,返回给浏览器。

 def index(request):
    # 业务逻辑代码
    return HttpResponse("OK")

render

除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。

将数据填充进模板文件,最后把结果返回给浏览器。

 def index(request):
    # 业务逻辑代码
    return render(request, "index.html", {"name": "alex", "hobby": ["烫头", "泡吧"]})

redirect

接受一个URL参数,表示跳转到指定的URL。

 def index(request):
    # 业务逻辑代码
    return redirect("/home/")

简单使用

urls.py写url 和函数的对应关系 写函数

 from django.shortcuts import HttpResponse, render
 ​
 def index(request):
    return HttpResponse('这里是index')   # 返回字符串
 ​
 def home(request):
    return render(request, 'home.html')   # 返回html页面
 ​
 urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', index),   # 路径和函数的对应关系
    url(r'^home/', home),
 ]

静态文件配置

在项目根目录存放静态文件夹,静态文件夹下可以存放css、js、img等项目中公用的静态文件或是文件夹。如果不想用 STATICFILES_DIRS 可以不用,都放在 app 里的 static 中也可以。

 在settings.py中设置
 ​
 STATIC_URL = '/static/'  # 别名,引入静态文件时以static开头,这里的static不是代表的目录
 ​
 STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
 ]
 ​
 【举例】
 STATICFILES_DIRS = [               #按照列表的顺序进行查找
    os.path.join(BASE_DIR, 'x1'),
    os.path.join(BASE_DIR, 'static'),
    os.path.join(BASE_DIR, 'x2')
 ]  

静态文件

MIDDLEWARE中间件

如果是提交post请求,注释掉settings.py下的MIDDLEWARE属性的csrf中间件 'django.middleware.csrf.CsrfViewMiddleware',用改解决请求时出现403 错误

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',
 ]

TEMPLATES模板路径设置

settings.pyTEMPLATES属性中,设置公用temples路径,是指到 BASE_DIR/templates文件夹中去取模板

 TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')]  #是指到  BASE_DIR/templates文件夹中去取模板
        ,
 ]

后边接触到app后,还可以在app中建立templates,是app专用的。

登录表单设置

form表单

  1. action 提交的地址,默认是往本地址提交数据 ;method 请求方法,默认是get,如果是实现认证功能的话,需要手动改成post

  2. input 需要有name ,用于提交数据时数据以可知的键值对方式传输,便于进行数据处理;required=""表示是必填项

  3. submit 提交的按钮或者input

  4. 前端校验,在form标签中使用novalidate

  5. django 中可以在函数中使用request.method从看看浏览器提交的请求方式;使用request.POST可以获取form提交的数据,获取的是一个字典

  6. 重定向:从django.shortcuts中导入redirect,让请求的页面跳转到其他指定的页面。redirect("https://cn.bing.com")跳转到指定的网页;redirect("/home/")跳转到本地的页面,前边的/必须要写,不然会加到前边的地址上;

前端模板

APP

将urls.py中定义的功能分类存放

新建APP

命令行:

python manage.py startapp app名称

pycharm中:

tools --> run manage.py task --> startapp app名

注册APP

在settings中进行注册

 INSTALLED_APPS = [
    'app01',  # 方法一
    'app01.apps.App01Config',  # 推荐写法
 ]

在urls.py中导入

从app中把函数或者功能导入到urls.py中

from app01 import views

目录

migrations文件夹存放迁移文件用

admin.py django admin

apps.py app的信息

models.py 模型 model 跟数据库有关

views.py 写函数和功能

ORM

Object Relational Mapping,对象关系映射,为了解决面向对象与关系数据库存在的互不匹配的技术。

ORM的优势

ORM解决的主要问题是对象和关系的映射。它通常将一个类和一张表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。

ORM提供了对数据库的映射,不用直接编写SQL代码,只需操作对象就能对数据库操作数据。

让软件开发人员专注于业务逻辑的处理,提高了开发效率。

ORM的劣势

ORM的缺点是会在一定程度上牺牲程序的执行效率。

ORM的操作是有限的,也就是ORM定义好的操作是可以完成的,一些复杂的查询操作是完成不了。

ORM用多了SQL语句就不会写了,关系数据库相关技能退化...

使用mysql数据库的流程

  1. 创建一个mysql数据库;

  2. 在settings.py中配置数据库:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',   # 引擎
            'NAME': '数据库名',   # 数据库名称
            'HOST': 'IP地址',      # IP
            'PORT': 3306,   # 端口号
            'USER': '用户名',       # 用户名
            'PASSWORD': '密码'      # 密码
        }
     }
  3. 使用pymysql模块连接mysql数据库。

    写在与settings同级目录下的__init__.py

     import pymysql
     pymysql.install_as_MySQLdb()
  4. 写对应关系,在app下的models.py中写类,定义数据表。

     class User(models.Model):
        username = models.CharField(max_length=32)  # username  varchar(32)
        password = models.CharField(max_length=32)  # password  varchar(32)
  5. 执行数据库迁移的命令

     python36 manage.py  makemigrations   # 记录下models.py的变更记录  
     ​
     python manage.py migrate   # 变更记录同步到数据库
  6. 所有要实现的功能放在views.py中,如果要用数据库,应该将数据库的models导入到该文件

     from django.shortcuts import render,redirect
     from app01 import models  
     ​
     def login(request):
        if request.method == 'GET':
            return render(request,'login.html')
     ​
        elif request.method == "POST":
            # 获取提交数据
            user = request.POST.get("username")
            pwd = request.POST.get("password")
            # ret = models.inf.objects.get(username=user,password=pwd) # get方法有一个特点是查不到数据或者查到多个数据时,会报错
            ret = models.inf.objects.filter(username=user,password=pwd)
            if ret:
                return redirect("/home/")
            else:
                return render(request,'login.html')
     ​
     def home(request):
        return render(request,'home.html')

注意

 查询操作时
 ret = models.User.objects.get(username=user, ) # 找不到就报错  找到多个也报错
 ret = models.User.objects.filter(username=user, )  # 过滤筛选,获取满足条件的所有的对象,存放在列表中

常用数据类型

常用字段

AutoField

自增的整形字段,必填参数primary_key=True,则成为数据库的主键。无该字段时,django自动创建。

一个model不能有两个AutoField字段。

IntegerField

一个整数类型。数值的范围是 -2147483648 ~ 2147483647。

CharField

字符类型,必须提供max_length参数。max_length表示字符的长度。

DateField

日期类型,日期格式为YYYY-MM-DD,相当于Python中的datetime.date的实例。

参数:

  • auto_now:每次修改时修改为当前日期时间。

  • auto_now_add:新创建对象时自动添加当前日期时间。

【注意】auto_now和auto_now_add和default参数是互斥的,不能同时设置。

DatetimeField

日期时间字段,格式为YYYY-MM-DD HH:MM:ss[.uuuuuu],相当于Python中的datetime.datetime的实例。

更多具体类型

更多
  1 AutoField(Field)
  2         - int自增列,必须填入参数 primary_key=True
  3   4  BigAutoField(AutoField)
  5         - bigint自增列,必须填入参数 primary_key=True
  6   7         注:当model中如果没有自增列,则自动会创建一个列名为id的列
  8  【举例】
  9   from django.db import models
 10  11   class UserInfo(models.Model):
 12             # 自动创建一个列名为id的且为自增的整数列
 13             username = models.CharField(max_length=32)
 14  15       class Group(models.Model):
 16             # 自定义自增列
 17           nid = models.AutoField(primary_key=True)
 18           name = models.CharField(max_length=32)
 19  20  SmallIntegerField(IntegerField):
 21         - 小整数 -32768 ~ 32767
 22  23  PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
 24         - 正小整数 0 ~ 32767
 25  26  IntegerField(Field)
 27         - 整数列(有符号的) -2147483648 ~ 2147483647
 28  29  PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
 30         - 正整数 0 ~ 2147483647
 31  32  BigIntegerField(IntegerField):
 33         - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
 34  35  BooleanField(Field)
 36         - 布尔值类型
 37  38  NullBooleanField(Field):
 39         - 可以为空的布尔值
 40  41  CharField(Field)
 42         - 字符类型
 43         - 必须提供max_length参数, max_length表示字符长度
 44  45  TextField(Field)
 46         - 文本类型
 47  48  EmailField(CharField):
 49         - 字符串类型,Django Admin以及ModelForm中提供验证机制
 50  51  IPAddressField(Field)
 52         - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
 53  54  GenericIPAddressField(Field)
 55         - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
 56         - 参数:
 57       protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
 58       unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启此功能,需要protocol="both"
 59  60  URLField(CharField)
 61         - 字符串类型,Django Admin以及ModelForm中提供验证 URL
 62  63  SlugField(CharField)
 64         - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
 65  66  CommaSeparatedIntegerField(CharField)
 67         - 字符串类型,格式必须为逗号分割的数字
 68  69  UUIDField(Field)
 70         - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
 71  72  FilePathField(Field)
 73         - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
 74         - 参数:
 75                 path,                     文件夹路径
 76                 match=None,               正则匹配
 77                 recursive=False,           递归下面的文件夹
 78                 allow_files=True,         允许文件
 79                 allow_folders=False,       允许文件夹
 80  81  FileField(Field)
 82         - 字符串,路径保存在数据库,文件上传到指定目录
 83         - 参数:
 84             upload_to = ""     上传文件的保存路径
 85             storage = None     存储组件,默认django.core.files.storage.FileSystemStorage
 86  87  ImageField(FileField)
 88         - 字符串,路径保存在数据库,文件上传到指定目录
 89         - 参数:
 90             upload_to = ""     上传文件的保存路径
 91             storage = None     存储组件,默认django.core.files.storage.FileSystemStorage
 92             width_field=None,   上传图片的高度保存的数据库字段名(字符串)
 93             height_field=None   上传图片的宽度保存的数据库字段名(字符串)
 94  95  DateTimeField(DateField)
 96         - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
 97  98  DateField(DateTimeCheckMixin, Field)
 99         - 日期格式     YYYY-MM-DD
100 101  TimeField(DateTimeCheckMixin, Field)
102         - 时间格式     HH:MM[:ss[.uuuuuu]]
103 104  DurationField(Field)
105         - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
106 107  FloatField(Field)
108         - 浮点型
109 110  DecimalField(Field)
111         - 10进制小数
112         - 参数:
113             max_digits,小数总长度
114             decimal_places,小数位长度
115 116  BinaryField(Field)
117         - 二进制类型
数据类型
 

猜你喜欢

转载自www.cnblogs.com/jjzz1234/p/11438309.html