Django 基础一

目录

  • ORM关系建立
  • django请求生命周期流程图
  • urls.py 路由层
    • 路由匹配
    • 无名分组:
    • 有名分组:
    • 反向解析
      • 第一种情况:路由中没有正则表达式 直接是写死的
      • 第三种情况:
    • 路由分发(******)
    • 名称空间
    • 伪静态
    • 虚拟环境
  • 视图层

ORM关系建立

先不考虑外键,先创基表

一对一 一般用在需要分级显示的情况(本来一张表可以的,被拆成了两张表,就成了一对一)

一对多 外键字段设在“多”的那张表里

多对多 需要建立一张单独的表来设置外键关系

图书管理系统之

作者表

from django.db import models
# 先创建基表,暂不考虑外键
class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=8, decimal_places=2)
    publish = models.Foreignkey(to='Publish')
    # to用来指代跟哪张表有关系 默认关联的就是表的主键字段

出版社表:

class publish(models.Model):
    title = models.Charfield(max_length=32)
    age = models.EmailField()

作者表:

class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    

一对多外键字段 创建的时候 同步到数据中 表字段会自动加_ id 后缀

如果你自己加了_ id, orm会再在后面加一个_ id
所以你在写一对多外键字段的时候 不要自作聪明的加_id

多对多的关系 外键字段建在任意一方都可以 但是建议你建在查询频率较高的那一方

一对一的表关系 外键字段建在任意一方都可以 但是建议你建在查询频率较高的那一方

author = models.ManyToManyField(to='Author')
# django orm会自动帮你创建书籍 和作者的第三张关系表
# author这个字段是一个虚拟字段 不能在表中展示出来 仅仅只是起到一个告诉orm 建第三章表的关系的作用

django请求生命周期流程图

urls.py 路由层

路由匹配

url第一个参数是一个正则表达式 只要该正则表达式能够匹配到内容
就会立刻执行后面的视图函数 而不再往下继续匹配了

# 取消django自动让浏览器加斜杠的功能
    APPEND_SLASH = False  # 该参数默认是True
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),  # url第一个参数是一个正则表达式
    url(r'^test/$', views.test),  # 一旦正则表达式能够匹配到内容 会立刻结束匹配关系 直接执行后面对应的函数
    url(r'^testadd/$', views.testadd),
]
# django匹配路由的规律
# 不加斜杠 先匹配一次试试 如果匹配不上 会让浏览器重定向 加一个斜杠再来一次 如果还匹配不上 才会报错
"""
路由匹配值匹配url部分
不匹配?后面的get携带的参数
"""

无名分组:

将分组内正则表达式匹配到的内容当做位置参数传递给视图函数

url(r'^test/([0-9]{4})/', views.test)
test() takes 1 positional argument but 2 were given

? 当你的路由中有分组的正则表达式 那么在匹配到内容接着执行视图函数的时候 会将分组内正则表达式匹配到的内容当做位置参数传递给视图函数

test(request,分组内正则表达式匹配到的内容)

有名分组:

会将分组内的正则表达式匹配到的内容当做关键字参数传递给视图函数

url(r'^testadd/(?P<year>\d+)/', views.testadd),
testadd() got an unexpected keyword argument 'year'

当你的路由中有分组并且给分组起了别名 那么在匹配内容的时候,会将分组内的正则表达式匹配到的内容当做关键字参数传递给视图函数

testadd(request,year=分组内的正则表达式匹配到的内容)

利用有名和无名分组 我们就可以在调用视图函数之前给函数传递额外的参数

注意:有名分组和无名分组不能混合使用

但是同一种分组的情况下 可以使用多次
无名可以有多个: url(r‘^index/(\d+)/(\d+)/‘, views.index),
有名可以有多个: url(r‘^index/(?P\d+)/(?P\d+)/‘, views.index),
但是就是不能混合使用

反向解析

根据一个别名 动态解析出一个结果 该结果可以直接访问对应的url,这个过程就是反向解析

第一种情况:路由中没有正则表达式 直接是写死的

url(r'^home/', views.home,name='xxx'),  # 给路由与视图函数对应关系起别名

前端反向解析
    {% url 'xxx' %}

后端反向解析
    from django.shortcuts import render,HttpResponse,redirect,reverse
    url = reverse('xxx')

第二种情况: 无名分组的反向解析 在解析的时候 你需要手动指定正则匹配的内容是什么

url(r'^home/(\d+)/', views.home,name='xxx'),  # 给路由与视图函数对应关系起别名
前端反向解析
<p><a href="{% url 'xxx' 12 %}">111</a></p>
<p><a href="{% url 'xxx' 1324 %}">111</a></p>
<p><a href="{% url 'xxx' 14324 %}">111</a></p>
<p><a href="{% url 'xxx' 1234 %}">111</a></p>

后端反向解析
url = reverse('xxx',args=(1,))
url1 = reverse('xxx',args=(3213,))
url2 = reverse('xxx',args=(2132131,))
# 手动传入的参数 只需要满足能够被正则表达式匹配到即可

第三种情况:

有名分组的反向解析 在解析的时候 你需要手动指定正则匹配的内容是什么
有名分组的反向解析可以跟无名分组一样
但是最最正规的写法应该是如下这样:

url(r'^home/(?P<year>\d+)/', views.home,name='xxx'),
# 给路由与视图函数对应关系起别名

前端
# 可以直接用无名分组的情况
<p><a href="{% url 'xxx' 12 %}">111</a></p>
# 你也可以规范写法
<p><a href="{% url 'xxx' year=1232 %}">111</a></p>  # 了解即可
后端
# 可以直接用无名分组的情况
url = reverse('xxx',args=(1,))
# 你也可以规范写法
url = reverse('xxx',kwargs={'year':213123})  # 了解即可

以编辑功能为例
url(r'^edit_user/(\d+)/',views.edit_user,name='edit')

def edit_user(request,edit_id):
# edit_id就是用户想要编辑数据主键值
pass

{% for user_obj in user_list %}
<a href='/edit_user/{{user_obj.id}}/'>编辑</a>
<a href='{% url 'edit' user_obj.id %}'>编辑</a>
{% endfor %}

路由分发(******)

前提
在django中所有的app都可以有自己独立的urls.py templates static
正是由于上面的特点 你用django开发项目就能够完全做到多人分组开发 互相不干扰
每个人只开发自己的app
小组长只需要将所有人开发的app整合到一个空的django项目里面
然后在settings配置文件注册 再利用路由分发将多个app整合到一起即可完成大项目的拼接

路由分发解决的就是项目的总路由匹配关系过多的情况

使用路由分发,使得总路由不再做匹配的活 而仅仅是做任务分发 ( 请求来了之后 总路由不做对应关系
只询问你要访问哪个app的功能 然后将请求转发给对应的app去处理 )

from app01 import urls as app01_urls
from app02 import urls as app02_urls

urlpatterns = [
    url(r'^admin/', admin.site.urls),  # url第一个参数是一个正则表达式
    # 路由分发
    url(r'^app01/',include(app01_urls)),  # 路由分发需要注意的实现 就是总路由里面不能以$结尾
    url(r'^app02/',include(app02_urls)),
    ]
# 子路由
from django.conf.urls import url
from app01 import views

urlpatterns = [
       url('^reg/',views.reg)
    ]
from django.conf.urls import url
from app02 import views

urlpatterns = [
    url('^reg/',views.reg)
    ]

最省事的写法(******)
url(r'^app01/',include('app01.urls')),
url(r'^app02/',include('app02.urls'))

名称空间

当多个app中出现了起别名冲突的情况 你在做路由分发的时候 可以给每一个app创建一个名称空间
然后在反向解析的时候 可以选择到底去哪个名称空间中查找别名

url(r'^app01/',include('app01.urls',namespace='app01')),
url(r'^app02/',include('app02.urls',namespace='app02'))

# 后端
print(reverse('app01:reg'))
print(reverse('app02:reg'))
# 前端
<a href="{% url 'app01:reg' %}"></a>
<a href="{% url 'app02:reg' %}"></a>

其实上面的名称空间知识点可以完全不用 你只需要保证起别名的时候 在整个django项目中不冲突即可.起别名的时候统一加上应用名前缀

urlpatterns = [
            url(r'^reg/',views.reg,name='app02_reg')
                ]

urlpatterns = [
            url('^reg/',views.reg,name='app01_reg')
                ]

伪静态

将一个动态网页伪装成一个静态网页 以此来挺好搜索引擎SEO查询频率和搜藏力度

所谓的搜索引擎其实就是一个也别巨大的爬虫程序

优化的再好还是抵不过RMB玩家

虚拟环境

给每一个项目 装备该项目所需要的模块 不需要的模块一概不装

每创建一个虚拟环境就类似于你重新下载了一个纯净python解释器
之后该项目用到上面 你就装什么(虚拟环境一台机器上可以有N多个)
不要在你的机器上无限制创建虚拟环境

django版本区别
django1.X django2.X

urls.py中路由匹配的方法有区别
django2.X用的是path
    urlpatterns = [
        path('admin/', admin.site.urls),
    ]
django1.X用的是url
    urlpatterns = [
        url(r'^reg.html',views.reg,name='app02_reg')
    ]
# 区别 django2.X里面path第一个参数不是正则也不支持正则 写什么就匹配什么
# 虽然path不支持正则 感觉也好用 django2.X还有一个re_path的方法 该方法就是你django1.X里面url
虽然path不支持 但是它提供了五种转换器  能够将匹配到的数据自动转黄成对应的类型
除了有默认五种转换器之外 还支持你自定义转换器

视图层

form表单上传文件 后端如何获取文件
form表达传文件需要注意的事项
1.method必须改成post
2.enctype该成formdata格式
前期你在使用post朝后端发请求的时候 需要去settings配置文件中注释掉一个中间件csrf

原文地址:https://www.cnblogs.com/allenchen168/p/11939292.html

时间: 2024-11-03 11:48:44

Django 基础一的相关文章

Python Day19-20(Django基础)

一.Django基础 1.基本配置补充 可以用pycharm一键创建工程和APP 其他常用命令: python manage.py runserver 1.1.1.1:8000 python manage.py startapp appname python manage.py syncdb python manage.py makemigrations python manage.py migrate python manage.py createsuperuser 数据库配置 setting

Django 基础教程

Django 基础教程 这是第一篇 Django 简介 ?  Django 是由 Python 开发的一个免费的开源网站框架,可以用于快速搭建高性能,优雅的网站! 你一定可以学会,Django 很简单!本教程一直在更新,从开始写到现在大概写了一年多了,现在也一直在坚持写,每一篇教程都可能随时更新,可以在网站首页看到最近更新的情况. 我阅读学习了全部的 Django英文的官方文档,觉得国内比较好的Django学习资源不多,所以决定写自己的教程.本教程开始写的时候是 Django 的版本是 1.6,

Python之路-(js正则表达式、前端页面的模板套用、Django基础)

js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../  用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 登录注册验证: test: 判断字符串是否符合规定的规则 rep = /\d+/;   (定义规则) rep.test('')   (引号里面必须包含字母和数字才返回true,否则为false) rep = /^\d+$/; (只有是纯数字时候才返回true,否则是false) exe

Django[基础知识]

Python功能最全的WEB框架:Django,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. 使用Django需进行以下操作: 1.创建Django项目,创建方式有两种. a.命令操作: django-admin startproject  dg_web   //dg_web为项目名称 b.直接在开发环境IDE下进行新建django项目 创建项目之后的文件目录如下: 2.在创建的项目下建立功能程序,操作如下: 命令行:python manage.py startap

Django基础和基本使用

Django基础 Django是Python下的一款著名的Web框架 框架 任何语言进入到高级部分时,会有认证.session.http.连接数据库等等功能操作,没有框架时需要自己实现 框架 是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例间交互的方法: Django优点 自带轮子众多,方便快速开发 如Auth,Cache,模板等 天生的MVC设计模块 实用的后台管理 自带ORM,Template,Form,Auth核心组件 简洁的url设计 周边插件丰富 Django缺点 重 同步阻

2 Django基础

1 django目录文件 1.1 自动生成的文件和文件夹 __init__.py:告诉 Python 该目录是一个 Python 包 settings.py:Django全局配置文件 urls.py:Django路由文件 wsgi.py:(Python Web Server Gateway Interface)服务器网关接口 templates:放置HTML文件的地方 manage.py:启动Django的主要文件 1.2 使用命令新建app 首先执行:Tools > Run manage.py

Python学习之旅—Django基础

前言  前段时间业务比较繁忙,没时间更新博客,从这周开始将继续为各位更新博客.本次分享的主题是Django的基础部分,涵盖Django MTV三部分,并通过一个简单的班级管理系统来说明如何使用Django进行开发,好啦,开始今天的主题吧! 一.浅谈MVC.MTV和MVVM 要学习Django,我们很有必要了解下MVC,MTV和MVVM三种模式. [001]MVC MVC(Model View Controller 模型-视图-控制器)是一种Web架构的模式(本文不讨论桌面应用的MVC),它把业务

Django基础之MTV模型

一.Django基础 一.Django简介 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型(Model).视图(View)和控制器(Controller).它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件.并于2005年7月在BSD许可证下发布.这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的. 1.mvc简介 http://blog.csdn.net/pi9n

Web框架和Django基础

核心知识点 1.web应用类似于一个socket客户端,用来接收请求 2.HTTP:规定了客户端和服务器之间的通信格式. 3.一个HTTP包含两部分,header和body,body是可选,\r\n分隔头部,\r\n\r\n分隔头部和身体. 4.WSGI:定义了用python编写的web服务程序和web应用程序的接口格式. 5.python标准库提供的独立的协议叫wsgiref,django也是使用它作为环境. 6.Django的目录结构(基本的:settings.py urls.py wsgi

Django基础01

我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. import socket sk = socket.socket() sk.bind(("127.0.0.1", 80)) sk.listen(5) while True: conn, addr = sk.accept() data = conn.recv(8096) conn.send(b"OK") conn.clo