Django示例演示--?
引用自:https://blog.csdn.net/weixin_42950386/article/details/83143293
定义模型类
模型类被定义在"应用/models.py"文件中,此例中为"booktest/models.py"文件。
模型类必须继承自Model类,位于包django.db.models中。
提示:对于重要数据使用逻辑删除。
示例演示
接下来首先以"图书-英雄"管理为例进行演示。
注意:这里我们用的版本是django==1.8.2版本。
了解和2.1版本的区别,请百度查询,这里不再啰嗦。
1.下载pymysql
pip install pymysql
设置test2/__init__.py文件
import pymysql
pymysql.install_as_MySQLdb()
配置数据库在settings.py中:
DATABASES = {
'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
'ENGINE': 'django.db.backends.mysql',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'NAME': 'test2',
'USER': 'root',
'PASSWORD': 'mysql',
'PORT': 3306,
'HOST': 'localhost',
}
}
2.打开booktest/models.py文件,定义模型类如下
from django.db import models
# from datetime import date
# Create your models here. class BookInfo(models.Model):
"""图书模型类"""
# 书名
btitle = models.CharField(max_length=40)
# 出版日期
bpub_date = models.DateField(default='1970-01-01')
# 阅读量
bread = models.IntegerField(default=0)
# 点赞量
bgood = models.IntegerField(default=0)
# 删除
is_del = models.BooleanField(default=False) class HeroInfo(models.Model):
"""英雄模型类"""
# 英雄名称
hname = models.CharField(max_length=20)
# 性别
hgender = models.BooleanField(default=False) # False为男
# 年龄
hage = models.IntegerField(default=18)
# 功夫
hcomment = models.CharField(max_length=128)
# 关联
hbook = models.ForeignKey("BookInfo")
# 删除
isDelete = models.BooleanField(default=False)
3.迁移
生成迁移文件。
创建数据库
python manage.py makemigrations
报错

解决方案:
看一下settings.py文件 apps中有没有添加 booktest

然后执行如下命令。
python manage.py makemigrations
python manage.py migrate
迁移

打开数据库的命令行,查看当前所有表如下图:

迁移
表bookinfo结构如:

默认值并不在数据库层面生效,而是在django创建对象时生效。
图书表结构
表booktest_heroinfo结构如下:

Django框架会根据关系属性生成一个关系字段,并创建外键约束。
英雄表结构
测试数据
在数据库命令行中,复制如下语句执行,向booktest_bookinfo表中插入测试数据:
insert into booktest_bookinfo(btitle,bpub_date,bread,bcomment,isDelete) values
('射雕英雄传','1980-5-1',12,34,0),
('天龙八部','1986-7-24',36,40,0),
('笑傲江湖','1995-12-24',20,80,0),
('雪山飞狐','1987-11-11',58,24,0);
再复制如下语句执行,向booktest_heroinfo表中插入测试数据:
insert into booktest_heroinfo(hname,hgender,hbook_id,hcomment,isDelete) values
('郭靖',1,1,'降龙十八掌',0),
('黄蓉',0,1,'打狗棍法',0),
('黄药师',1,1,'弹指神通',0),
('欧阳锋',1,1,'蛤蟆功',0),
('梅超风',0,1,'九阴白骨爪',0),
('乔峰',1,2,'降龙十八掌',0),
('段誉',1,2,'六脉神剑',0),
('虚竹',1,2,'天山六阳掌',0),
('王语嫣',0,2,'神仙姐姐',0),
('令狐冲',1,3,'独孤九剑',0),
('任盈盈',0,3,'弹琴',0),
('岳不群',1,3,'华山剑法',0),
('东方不败',0,3,'葵花宝典',0),
('胡斐',1,4,'胡家刀法',0),
('苗若兰',0,4,'黄衣',0),
('程灵素',0,4,'医术',0),
('袁紫衣',0,4,'六合拳',0);
4,后台管理
打开test1/settings.py文件,找到语言编码、时区的设置项,将内容改为如下
LANGUAGE_CODE = 'zh-hans' #使用中国语言
TIME_ZONE = 'Asia/Shanghai' #使用中国上海时间
admin.py文件中:
from django.contrib import admin
from booktest.models import *
# Register your models here. # 关联对象
# 1.以块的形式嵌入
# 创建StackedInline类
class BookStackedInline(admin.StackedInline):
# 写多类的名字
model = HeroInfo
# 额外设置编辑子对象 默认为3个
extra = 2 # 额外编辑两个对象 # 2.以表格的形式嵌入
class BookTabularInline(admin.TabularInline):
# 写多类的名字
model = HeroInfo
# 额外设置编辑子对象 默认为3个
extra = 2 # 额外编辑两个对象 class BookInfoAdmin(admin.ModelAdmin):
# 每页显示多少条数据
list_per_page = 10
# 顶部显示的属性,设置为True在顶部显示,设置为False不在顶部显示,默认为True
actions_on_top = True
# 底部显示的属性,设置为True在底部显示,设置为False不在底部显示,默认为False
actions_on_bottom = True
# 自定义显示字段
# list_display = [模型字段1,模型字段2....] 模型字段可以是BookInfo里面设置的属性名 也可以是方法名
list_display = ['id', 'btitle', 'bpub_date', 'title']
# 方法列排序 在models.py文件
# 右侧栏过滤器
list_filter=['btitle'] # 以btitle 过滤
# 搜索框
search_fields = ['btitle'] # 以btitle字段搜索
# 关联BookStackedInline类 块类
# inlines = [BookStackedInline]
# 关联BookTabularInline类
inlines = [BookTabularInline] class HeroInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'hname', 'hcomment'] class AreaInfoAdmin(admin.ModelAdmin):
list_display = ['id', 'atitle', 'parent']
# 编辑页
# 添加/修改页面字段顺序
# fields = ['aParent', 'atitle']
# 分组显示 fieldsets=() 后面跟元祖
# 与fields=[] 不能同时使用
fieldsets = (
('基本', {'fields':['aParent']}),
('高级', {'fields':['atitle']})
) # 注册
admin.site.register(BookInfo, BookInfoAdmin)
admin.site.register(HeroInfo, HeroInfoAdmin)
admin.site.register(AreaInfo, AreaInfoAdmin)
models.py文件中各种方法
from django.db import models
from datetime import date
# Create your models here.
# 建立一个Manager类
class InfoManager(models.Manager):
"""管理器类"""
# 改变查询的结果
def all(self):
# 1.调用父类结果
result = super().all()
# 改变结果
return result.filter(isDelete=False) def create_book(self, btitle, bpub_date):
# 获取模型所在的模型类
model_class = self.model
# 创建对象
book = model_class()
book.btitle = btitle
book.bpub_date = bpub_date
book.save()
return book class BookInfo(models.Model):
"""图书模型类"""
# 书名
# btitle = models.CharField(max_length=20,verbose_name='书名') # verbose_name= 给列标题改名
btitle = models.CharField('书名',max_length=20) # 也可以第一个参数放中文标题 不用加verbose_name=
# 出版时间
bpub_date = models.DateField()
# 阅读量
bread = models.IntegerField(default=0)
# 评论数
bcomment = models.IntegerField(default=0)
# 是否删除
isDelete = models.BooleanField(default=False)
# 建立manager对象
objects = InfoManager() # 将方法做列
def title(self):
return self.btitle
# 方法列排序
title.admin_order_field='btitle'
# 方法列标题改名
title.short_description = '书名(方法列)' class HeroInfo(models.Model):
"""英雄模型类"""
# 名字
hname = models.CharField(max_length=20)
# 性别
hgender = models.BooleanField(default=False)
# 功夫
hcomment = models.CharField(max_length=128)
# 书名
hbook = models.ForeignKey('BookInfo')
# 是否删除
isDelete = models.BooleanField(default=False) class AreaInfo(models.Model):
"""地区模型类"""
# 地区名
atitle = models.CharField(max_length=20)
# 关系属性 代表当前地区父类地区
aParent = models.ForeignKey('self', null=True, blank=True) def __str__(self):
return self.atitle # 封装方法 访问关联对象成员
def parent(self):
if self.aParent is None:
return ''
else:
return self.aParent.atitle parent.short_description = '父级区域名称'
重写模板
1)在templates/目录下创建admin目录,结构如下图:

2)打开当前虚拟环境中Django的目录,再向下找到admin的模板,目录如下:
/home/python/.virtualenvs/py_django/lib/python3.5/site-packages/django/contrib/admin/templates/admin

编辑base_site.html文件:
{% extends "admin/base.html" %}
{% block title %}{{ title }} | {{ site_title|default:_('Django site admin') }}{% endblock %}
{% block branding %}
<h1 id="site-name"><a href="{% url 'admin:index' %}">{{ site_header|default:_('Django administration') }}</a></h1>
<hr>
<h1>自定义的管理页模板</h1>
<hr>
{% endblock %}
{% block nav-global %}{% endblock %}
创建管理员
终端中命令如下:
python manage.py createsuperuser
根据提示输入管理员、邮箱、密码

启动服务器
python manage.py runserver

打开浏览器,在地址栏中输入如下地址后回车
http://127.0.0.1:8000/admin/

输入建立的管理员和密码登录

4.定义视图
打开booktest/views.py文件,定义视图代码如下:
from django.shortcuts import render, redirect # redircet重定向
from booktest.models import *
from datetime import date
from django.http import HttpRequest, HttpResponse
# Create your views here.
def index(request): # 查看所有书
list = BookInfo.objects.all()
return render(request, 'booktest/index.html', {'list': list}) def create(request): b = BookInfo()
b.btitle = '流星蝴蝶剑'
b.bpub_date = date(1989,2,1)
b.save()
return redirect(index) # 跳转回首页 def delete(request, bid): b = BookInfo.objects.get(id=bid)
b.delete()
return redirect(index) def books(request, bid):
b = BookInfo.objects.get(id=bid)
list = b.heroinfo_set.all() return render(request, 'booktest/detail.html', {'list':list,'book':b})
5.配置url
打开test2/urls.py文件,配置url如下:
from django.conf.urls import include, url
from django.contrib import admin urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
# 引入booktest的url配置
url(r'^', include('booktest.urls')), # booktest.urls要加引号,不然找不到文件 ?
]
在booktest应用下创建urls.py文件,代码如下:
from django.conf.urls import include, url
from django.contrib import admin
from booktest import views urlpatterns = [
url(r'^index$', views.index),
url(r'^create$', views.create),
# 传值用() 扩起来 如:(\d+)
url(r'^delete/(\d+)$', views.delete),
url(r'^books/(\d+)$', views.books),
]
6.创建模板
打开test2/settings.py文件,配置模板查找目录TEMPLATES的DIRS。
‘DIRS’: [os.path.join(BASE_DIR,‘templates’)],
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
模板目录
创建templates/booktest/index.html文件。
模板文件

渲染模板index.html:
<a href="/create">新增</a>
<ul>
{% for book in list %}
<li><a href="/books/{{ book.id }}">{{ book.btitle }}</a> --- <a href="/delete/{{ book.id }}">删除</a></li>
{% endfor %}
</ul>
7.运行 运行服务器。
python manage.py runserver (主机名 端口号) 括号里可以省去
在浏览器中查看。

首页
操作效果如下图。

运行
在mysql命令行中查看数据表变化如下图:
数据变化

静态文件配置
在settings.py文件中定义静态文件存放的物理目录
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
在项目根目录下创建static目录,再创建img、css、js目录

ajax登录提示403


这是csrf机制导致的 打开settings.py
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware', # 把这行注释了就可以了
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
模板继承
继承格式:{% extends 父模板文件路径%}
例:
{% extends 'layout/header.html' %}
{% block 块名 %}
{{ block.super}} #获取父模板中块的默认内容
重写的内容
{% endblock 块名%}
html转义
要关闭模板上下文字符串的转义:
可以使用 {{ 模板变量|safe}}
也可以使用:
{% autoescape off %}
模板语言代码
{% endautoescape %}
模板硬编码中的字符串默认不会经过转义,如果需要转义,那需要手动进行转义
验证码
1)安装包
pip install Pillow==3.4.1
2)在booktest/views.py文件中,创建视图verify_code
from PIL import Image, ImageDraw, ImageFont
from django.utils.six import BytesIO
...
def verify_code(request):
#引入随机函数模块
import random
#定义变量,用于画面的背景色、宽、高
bgcolor = (random.randrange(20, 100), random.randrange(
20, 100), 255)
width = 100
height = 25
#创建画面对象
im = Image.new('RGB', (width, height), bgcolor)
#创建画笔对象
draw = ImageDraw.Draw(im)
#调用画笔的point()函数绘制噪点
for i in range(0, 100):
xy = (random.randrange(0, width), random.randrange(0, height))
fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
draw.point(xy, fill=fill)
#定义验证码的备选值
str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0'
#随机选取4个值作为验证码
rand_str = ''
for i in range(0, 4):
rand_str += str1[random.randrange(0, len(str1))]
#构造字体对象,ubuntu的字体路径为“/usr/share/fonts/truetype/freefont”
font = ImageFont.truetype('FreeMono.ttf', 23)
#构造字体颜色
fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255))
#绘制4个字
draw.text((5, 2), rand_str[0], font=font, fill=fontcolor)
draw.text((25, 2), rand_str[1], font=font, fill=fontcolor)
draw.text((50, 2), rand_str[2], font=font, fill=fontcolor)
draw.text((75, 2), rand_str[3], font=font, fill=fontcolor)
#释放画笔
del draw
#存入session,用于做进一步验证
request.session['verifycode'] = rand_str
#内存文件操作
buf = BytesIO()
#将图片保存在内存中,文件类型为png
im.save(buf, 'png')
#将内存中的图片数据返回给客户端,MIME类型为图片png
return HttpResponse(buf.getvalue(), 'image/png')
3)打开booktest/urls.py文件,配置url
url(r'^verify_code/$', views.verify_code),
调用验证码
1)在booktest/views.py文件中,创建视图verify_show。
def verify_show(request):
return render(request,'booktest/verify_show.html')
2)打开booktest/urls.py文件,配置url。
url(r'^verify_show/$', views.verify_show),
3)在templates/booktest/目录下创建verify_show.html。
<html>
<head>
<title>验证码</title>
</head>
<body>
<form method="post" action="/verify_yz/">
{%csrf_token%}
<input type="text" name="yzm">
<img id="yzm" src="/verify_code/"/>
<span id="change">看不清,换一个</span>
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
验证
1)在booktest/views.py文件中,创建视图verify_yz。
def verify_yz(request):
yzm=request.POST.get('yzm')
verifycode=request.session['verifycode']
response=HttpResponse('no')
if yzm==verifycode:
response=HttpResponse('ok')
return response
2)打开booktest/urls.py文件,配置url。
url(r'^verify_yz/$', views.verify_yz),
反向解析
当某一个url配置的地址发生变化时,页面上使用反向解析生成地址的位置不需要发生变化。
根据url 正则表达式的配置动态的生成url。
在项目urls中包含具体应用的urls文件时指定namespace;

在应用的urls中配置是指定name;

在模板文件中使用时,格式如下:
{% url 'namespace名字:name' %} 例如{% url 'booktest:fan2'%}
带位置参数:
{% url 'namespace名字:name' 参数 %} 例如{% url 'booktest:fan2' 1%}
带关键字参数:
{% url 'namespace名字:name' 关键字参数 %} 例如{% url 'booktest:fan2' id=1 %}
在重定向的时候使用反向解析:
from django.core.urlresolvers import reverse
无参数:
reverse('namespace名字:name名字')
如果有位置参数
reverse('namespace名字:name名字', args = 位置参数元组)
如果有关键字参数
reverse('namespace名字:name名字', kwargs=字典)
中间件
1) 新建middleware.py文件。

2) 定义中间件类。

在类中定义中间件预留函数。
__init__:服务器响应第一个请求的时候调用。
process_request:是在产生request对象,进行url匹配之前调用。
process_view:是url匹配之后,调用视图函数之前。
process_response:视图函数调用之后,内容返回给浏览器之前。
process_exception:视图函数出现异常,会调用这个函数。
如果注册的多个中间件类中包含process_exception函数的时候,调用的顺序跟注册的顺序是相反的。
3) 注册中间件类。

图片上传
Django示例演示--?的更多相关文章
- 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- 数据库分库分表(sharding)系列(一)拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- 据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- dorado 的学习位置、控件使用方法查找、示例演示地址
dorado的学习位置: http://wiki.bsdn.org/display/dorado7/Project+Home dorado的控件使用方法查找: http://dorado7.bsdn. ...
- java 工厂模式的作用,为什么要用工厂模式以及示例演示
1 工厂模式的作用,为什么要用工厂模式? 工厂模式是为了解耦:把对象的创建和使用的过程分开.就是Class A 想调用Class B,那么只是调用B的方法,而至于B的实例化,就交给工厂类. 工厂模式可 ...
- Python正则表达式的简单应用和示例演示
前一阵子小编给大家连续分享了十篇关于Python正则表达式基础的文章,感兴趣的小伙伴可以点击链接进去查看.今天小编给大家分享的是Python正则表达式的简单应用和示例演示,将前面学习的Python正则 ...
- DB 分库分表(1):拆分实施策略和示例演示
DB 分库分表(1):拆分实施策略和示例演示 第一部分:实施策略 1.准备阶段 对数据库进行分库分表(Sharding化)前,需要开发人员充分了解系统业务逻辑和数据库schema.一个好的建议是绘制一 ...
- SQL Server时间粒度系列----第9节时间粒度示例演示
本文目录列表: 1.准备测试数据 2.向测试数据表添加相关时间粒度字段列 3.基于日月季年统计汇总的演示 4.总结语 5.参考清单列表 准备测试数据 为了提供不同时间粒度示例的演示,就需要测试 ...
- Erlang基础 -- 介绍 -- Wordcount示例演示
在前两个blog中,已经说了Erlang的历史.应用场景.特点,这次主要演示一个Wordcount的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数. 今天和群友们讨论了一个问 ...
随机推荐
- 悬架的灵魂——K&C特性
静止便是死亡,只有运动才能敲开永生的大门 — 泰戈尔 KC特性是车辆操控稳定性的直接影响者!可以分为 K ( Kinematic) 特性和 C( Compliance) 特性: K 特性即悬 ...
- c++中的不是数的数nan
matlab中经常碰到nan,inf等特殊“数”,而在C++中也有相应的表示:例如std::numeric_limits <float>::quiet_NaN ();可以得到浮点型的nan ...
- Spring中的AOP实现思路
AOP是面向切面编程,为什么在切面中写一个注解方法@Before,这个方法会在目标方法前面执行呢 基于JDK动态代理实现上面说的情况 自定义注解 @Target({ ElementType.METHO ...
- SpringBoot项目使用RedisTemplate设置序列化方式
前端时间新项目使用SpringBoot的RedisTemplate遇到一个问题,先简单描述一下问题:不同项目之间redis共用一个,但是我们新项目读不到老项目存储的缓存.新项目搭建的时候没有跟老项目使 ...
- XGBoost 重要参数(调参使用)
XGBoost 重要参数(调参使用) 数据比赛Kaggle,天池中最常见的就是XGBoost和LightGBM. 模型是在数据比赛中尤为重要的,但是实际上,在比赛的过程中,大部分朋友在模型上花的时间却 ...
- Tensorflow基本概念笔记
一.TensorFlow使用简单,部署快捷 TensorFlow使用数据流图(计算图)来规划计算流程,可以将计算映射到不同的硬件和操作平台.凭借着统一的架构,TensorFlow可以方便的部署剑各种平 ...
- MySQL练手小试题
创建表和数据 创建class表 create table class ( cid int(11) primary key auto_increment, caption varchar(32) not ...
- Winform 快速开发框架,上位机开发,工控机程序开发,CS程序开发
1.当客户让你做个CS程序时,当你手上一穷二白,所有都要重复造轮,你是不是很烦. 2.但如果有一个通用的,快速开发框架,就可以把你从这些基础的工作解救出来,你专注做业务就好了. 3.本人其中一个项目的 ...
- mysql中常见正则表达式的应用
查找name字段中以'st'为开头的所有数据: mysql> SELECT name FROM person_tbl WHERE name REGEXP '^st'; 查找name字段中以'ok ...
- git学习笔记 ---删除文件
在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交: $ git add test.txt $ git commit -m "add test. ...