Django的MTV框架基础
# 配置数据库
DATABASES = {'default': {# 数据库引擎'ENGINE': 'django.db.backends.mysql',# 数据库名称'NAME': 'axf',# 账号和密码'USER': 'root','PASSWORD': '123456',# IP和端口'HOST': 'localhost','PORT': '3306'}
}
- 将具体语言下的【数据及其结构(通常以类表示)】映射为数据库的【表结构和数据】
- 在Django中,一旦数据结构发生变化,就需要重新进行数据迁移
- python manage.py makemigrations 生成数据迁移py文件
- python manage.py migrate 执行数据迁移
models.IntegerField(default=1)
models.FloatField(default=0)
models.BooleanField(default=False)
models.NullBooleanField() #支持null、true、false三种值#
models.TextField(db_column='ps') #大文本字段,一般超过4000使用#
models.DateTimeField(auto_now=True)
#使用Python的datetime.datetime实例表示的日期和时间
#若auto_now=True,每次保存对象时,自动设置该字段为当前时间
#若auto_now_add=True,当对象第一次被创建时自动设置当前时间(一次性的时间戳)
#注意:auto_now_add, auto_now,default三者是互斥的
model.DecimalField(max_digits=None, decimal_places=None)
#使用python的Decimal实例表示的十进制浮点数
#max_digits=总位数
#decimal_places=小数位数
model.DateField([auto_now=False, auto_now_add=False]) #使用Python的datetime.date实例表示的日期#
model.TimeField #使用Python的datetime.time实例表示的时间#
models.AutoField(primary_key=True)
#一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定,一个主键字段将自动添加到模型中
model.FileField #上传文件字段
icon = models.ImageField(upload_to='icons')
#继承于FileField,框架对上传的对象进行校验,确保它是个有效的image
username = models.CharField(max_length=32, unique=True)
定义布尔值范例:
sex = models.BooleanField(default=False)
primary_key=False
#django会为表增加自动增长的主键列
#如果使用选项设置某属性为主键列后,则django不会再生成默认的主键列
max_length=None
unique=False
null=False #如果为True,则默认以空值NULL填充
blank=False #如果为True,则该字段允许为空白(即空字符串),这个约束常常用于表单验证
default=NOT_PROVIDED
db_index=False #若值为 True, 则在表中会为此字段创建索引
db_column=None #字段的名称,如果未指定,则使用属性的名称
class Field(RegisterLookupMixin):...def __init__(self, verbose_name=None, name=None, primary_key=False,max_length=None, unique=False, blank=False, null=False,db_index=False, rel=None, default=NOT_PROVIDED, editable=True,serialize=True, unique_for_date=None, unique_for_month=None,unique_for_year=None, choices=None, help_text='', db_column=None,db_tablespace=None, auto_created=False, validators=(),error_messages=None):...
class Meta:db_table = 'Flower'ordering = ["-f_color"]
# 用户数据模型
class UserModel(models.Model):# 用户名密码邮箱username = models.CharField(max_length=32, unique=True)password = models.CharField(max_length=256)email = models.CharField(max_length=64, unique=True)# False 代表女sex = models.BooleanField(default=False)# 头像,图片字段,上传到静态资源文件夹下的icons/icon = models.ImageField(upload_to='icons')# 是否被逻辑删除is_delete = models.BooleanField(default=False) class Meta:db_table = "t_user"
XXX.objects.all()
XXX.objects.get(k1=v1,k2=v2)
过滤器:
XXX.objects.filter(条件语句)
XXX.objects.exclude(条件语句)
gt 、lt、gte、lte
startswith(大小写敏感)、endswith、contains、exact
istartswith(忽略大小写)、iendswith、icontains、iexact
class IDCard(models.Model):i_num = models.CharField(max_length= 18)# False 代表女i_sex = models.BooleanField(default=False)# 一张身份证对应着一个人i_person = models.OneToOneField(Person, on_delete=models.SET_NULL, null=True)
class Hobby(models.Model):h_name = models.CharField(max_length=16)h_cost = models.FloatField(default=1000)h_person = models.ForeignKey(Person, on_delete=models.PROTECT)
class Goods(models.Model):g_name = models.CharField(max_length=128)g_price = models.FloatField(default=1)# 声明商品和买家有多对多关系g_buyers = models.ManyToManyField(Buyer)
goods.g_buyers.add(buyer)
buyers = goods.g_buyers.all()
goods_list = buyer.goods_set.all()
models.CASCADE —>默认值,默认删除级联数据
models.PROTECT —> 不存在级联数据的时候允许删除&当存在级联数据的时候删除会抛出保护异常
models.SET_NULL —> 级联数据赋值为空
models.SET_DEFAULT —>前提是字段本身有默认值
models.SET() —>删除的时候重新动态指向一个实体
class Dog(models.Model):d_name = models.CharField(max_length=16)d_legs = models.IntegerField(default=4)is_delete = models.BooleanField(default=False)# 交由管理器进行管理d_manager = MyManager()
class MyManager(models.Manager):
定义创建实例方法:
# 创建狗的实例,默认两条腿
def create_model(self,d_name, d_legs = 2):dog = self.model()dog.d_name = d_namedog.d_legs = d_legsreturn dog
# 默认不包含被逻辑删除的狗狗
# 先调用model.Manager get_queryset
def get_queryset(self):return super(MyManager,self).get_queryset().exclude(is_delete=True)
dog = Dog.d_manager.create_model("中国田园犬")
查询实例:
dogs = Dog.d_manager.all()
dogs = Dog.d_manager.all().filter(is_delete=False)
dogs = Dog.d_manager.filter(d_legs__lt=100)
dogs = Dog.d_manager.filter(Q(d_legs__lt=20)|Q(d_legs__gt=150))
# 动物父类
class Animal(models.Model):#名字和腿数a_name = models.CharField(max_length=16, default='Animal')a_legs = models.IntegerField(default=4)class Meta:#表名是抽象的,框架不会为当前类创建表abstract = True
# 动物子类狗狗
class Dog(Animal):#已经有了a_name和a_legs#定义自己独有的字段d_fun = models.TextField()
查询 —>
flowers = Flower.objects.all()
flowers = Flower.objects.all().order_by("-id")[0:2]
flowers = Flower.objects.filter(f_color__gt=100).filter(f_color__lt=150)
flowers = Flower.objects.filter(f_color__gt=100).exclude(f_color__gt=150).filter(f_name__contains="水")
flowers = Flower.objects.filter(f_name__endswith="1")
flowers = Flower.objects.filter(f_name="rose")
flowers = Flower.objects.filter(pk__in=[1,2,3,4])
flowers = Flower.objects.filter(f_time__year="2019")
students = Student.objects.filter(s_grade_id__gt=F('id')-5)
----------------------------------------------------------------------------
flower = Flower.objects.get(pk=10)
flower = Flower.objects.get(f_color=255)
----------------------------------------------------------------------------
flower = flowers.last()
flower = flowers.first()
if flowers.count() == 0:
if flowers.exists():
----------------------------------------------------------------------------
dogs = Dog.objects.filter(~Q(d_legs__lt=100))
插入 —>
grade = Grade()
grade.g_name = 'fuck'
grade.save()
----------------------------------------------------------------------------
person = Person.objects.create(p_name="小黄%d"%random.randrange(110))
p = Buyer.objects.create(b_name="清醒%d下" % flag)
goods = Goods.objects.create(g_name="娃娃%d" % flag, g_price=flag)
删除 —>
通过查询得到一个特定的grade对象
grade.delete()
修改 —>
通过查询得到一个特定的grade对象
grade.gname='shit'
grade.save()
# django默认的模板配置
TEMPLATES = [ { ...,# 模板路径'DIRS': [os.path.join(BASE_DIR, 'templates'),],...},]
{{ xxx }}
{{ xxx.attr }}
{{ xxx.method }}
{{ xxx.i }}
{{ xxx.key }}
<!--普通HTML注释是可见的-->
{# 模板注释是不可见的 #}
{% comment %}...{% endcomment %} #注释掉一吨内容
加减 —> {{ value|add:10 }} —> {{ value|add:-10 }}
乘除 —> {% widthratio a b c %} # a/b*c
大小写转换 —> {{ animal.a_name|lower }}—> {{ animal.a_name|upper }}
判断是否整除 —> {% if forloop.counter|divisibleby:2 %}
连接容器内元素 —> {{ animals|join:'=' }}
—> {% load static %}
—> {% load staticfiles %}
—> <img src="{% static 'img/dragon.gif' %}"> #访问静态资源
—> settings.py配置:
·静态文件夹位置
·访问路由
·静态文件访问路由
STATIC_URL = '/static/'
# 静态文件存储目录:根目录/static/
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),
]
{% if forloop.first %}{% if forloop.last %}{{ forloop.counter0 }} #正序下标,索引从0开始{{ forloop.counter }} #正序下标,索引从1开始算{{ forloop.revcounter }} #逆序,索引从最大长度到1
—> forloop.revcounter0 #逆序,索引从最大长度到0
—> forloop.parentloop #获取上一层 for 循环的 forloop
—> {% empty %} #当列表为空时用 for empty:
举栗子:
{% for animal in animals %}<li>{{ animal.a_name }}</li>
{% empty %}
<h3>动物都跑啦</h3>
{% endfor %}
—> {% if forloop.first %}...{% elif forloop.last %}...{% else %}...{% endif %}
—> {% ifequal value1 value2 %}...{% else %}...{% endifequal %}
—> {% ifnotequal value1 value2 %}...{% else %}...{% endifnotequal %}
—> {% autoescape off %} {{ content }} {% endautoescape %}
—> {{ content|safe }}
—> {% autoescape on %} {{ content }} {% endautoescape %}
—> {{ content }}
—> {% block extCSS %}...{% endblock %}
—> {{ block.super }} #引用父模板对当前块的实现
—> {% extends 'base_main.html' %} #继承父模板
—> {% include xxx.html %} #兼并另一个模板使之成为页面的一部分
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/css/swiper.css"><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/css/swiper.min.css">
<script src="https://cdn.bootcss.com/jquery/1.11.1/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/js/swiper.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/js/swiper.jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/js/swiper.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/3.4.2/js/swiper.jquery.min.js"></script>
<div class="swiper-container" id="topSwiper"> # 外层包裹,需要配合脚本使用 ^.^对应脚本
<div class="swiper-wrapper"> # 翻页包装器
<div class="swiper-slide">...</div> # 分页内容1
<div class="swiper-slide">...</div> # 分页内容2
—> 如果需要分页器 : <div class="swiper-pagination"></div>
—> 如果需要导航按钮 :<div class="swiper-button-prev"></div>
—> 如果需要滚动条 :<div class="swiper-scrollbar"></div>
$(function () {var swiper = Swiper(".swiper-container",{});
})
template = loader.get_template('Hello.html') # <class 'django.template.backends.django.Template'>
result = template.render()) # <class 'django.utils.safestring.SafeText'>
result = template.render(context={"haha":"你哈什么哈"}) # 渲染时给模板传递数据
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),
]
{% load static %}
<img src="{% static 'img/dragon.gif' %}">
url(r'^hehe/(\d+)/', views.hehe_user, name='hehe')
def hehe_user(request, user_id):
url(r'^getdate/(?P<month>\d+)/(?P<day>\d+)/(?P<year>\d+)', views.get_date, name='getdate')
def get_date(request, year, month, day)
{% url 'namespace:name' value1 value2 ...%}
{% url 'namespace:name' key=value key=value ...%}
reverse('namespace:name', args=(value1,value2...))
reverse('namespace:name', kwargs={key:value, key: value})
Django的MTV框架基础相关推荐
- python框架Django中MTV框架之VIew(业务控制器)
MTV框架之VIew(业务控制器) 关注公众号"轻松学编程"了解更多. 1.什么是视图 视图层=路由表(urls.py)+视图函数(views.py) 其角色相当于MVC中的Con ...
- Django之web框架的本质
web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应, ...
- MCV 和 MTV框架基本信息
一 . MCV # web服务器开发最著名的MVC模式M : model.py 就是和数据库打交道的, 创建表等操作V : view 视图(视图函数,就是装HTML文件的)C : controller ...
- Django之MVC框架与MTV框架详解
Django框架简介 MVC框架和MTV框架(了解即可) MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图 ...
- python框架django文档_Django基础——Django框架介绍及模板语言
Django框架,我们只需要关心二点: 1.根据用户访问不同的路径执行不同的函数 2.从HTML读取出内容,并且完成字符串的替换 而socket通信不需要我们自己写: 新建Django项目 命令行创建 ...
- Django框架基础学习
Django安装 python下载地址 http://www.python.org/download/releases/3.3.4/ Django的下载地址:https://www.djangopro ...
- Django框架基础知识汇总(有项目版)
Web框架本质## web系统概念 1. Http,无状态,短连接 2. 浏览器(socket客户端).网站(socket服务端) web框架本质 import socket def handle_r ...
- python学习框架图-Python学习---Python的框架基础学习
框架基础 框架实质: 所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端 B/S结构的响应: import socket def handle_requ ...
- Django的MTV模式详解
参考博客:https://www.cnblogs.com/yuanchenqi/articles/7629939.html 一.MVC模型 Web服务器开发领域里著名的MVC模式. 所谓MVC就是把W ...
最新文章
- Linux概念架构的理解
- linux(gentoo)安装配置conky
- 百度绿色底座亮相 AI原生云低碳前行
- gdb 调试 TuMediaService
- 揭秘!如何用Flutter设计一个100%准确的埋点框架?
- Python编程 | 新手必会的 9 个 Python 技巧
- 深度学习的实用层面 —— 1.10 梯度消失与梯度爆炸
- 空冷器投用步骤_石油二厂制氢装置为空冷器“洗澡”【奋进之路】
- HTML示例03---标题的对齐方式
- 剑指offer——面试题54:表示数值的字符串
- 朗文3000词汇表带音标_SBS朗文国际英语教程第二册单词表(带音标)
- Flash Builder 4.6(安装破解)
- Android高德地图点击大头针更换大头针图片
- ArcGIS基础:要素转点、要素折点转点与面转线
- 学大伟业DAY2模拟赛
- 解决IE没有响应、卡死现象
- 混合云的那些事:如何做到让公有云和私有云实现1+12
- 项目管理从需求管理开始--不懂需求管理还敢带项目?
- 2022天梯赛个人代码留存
- sql教师表存储过程
热门文章
- 教你如何教女朋友学Python?
- ubantu关机快捷键_ubuntu常用快捷键和终端快捷键
- Pandas:细说groupby和aggregate、transform、apply以及filter
- PS2 读电脑键盘实验
- 【计网笔记03】计算机网络之局域网、广域网、VLAN虚拟局域网、IPv4地址、子网划分和子网掩码
- 骨传导耳机哪个好、骨传导耳机排名
- 淡淡的生活,淡淡的爱......
- 刀剑二文件夹服务器,2021年2月2日服务器移民公告
- Kotlin 集合函数锦集,这操作真香
- uni-app app清除app缓存,使用一段时间app数据图片等缓存清理,记录一下