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的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数. 今天和群友们讨论了一个问 ...
随机推荐
- TCP/IP学习笔记18--TCP--拥塞控制 (慢开始, 拥塞避免, 快重传和快恢复)
用最多的梦面对未来 -- 李嘉诚 在某段时间,若对网络资源的需求超过了该资源所能提供 ...
- 《PHP - 信号/基本操作/配置》
一:PHP 信号 - SIGINT / SIGTERM / SIGQUIT - 退出FPM,在master收到退出信号后将向所有的worker进程发送退出信号,然后master退出. - SIGUSR ...
- 08-Maps
Maps map 是在 Go 中将值(value)与键(key)关联的内置类型.通过相应的键可以获取到值.Maps类似于python中的字典 Maps定义 maps的key值必须是可hash(就是不可 ...
- leetcode 罗马数字和数字的互相转换
不知哪个大佬说过: 关于字符串的题都可以用指针或哈希解决. 罗马数字转数字: 思想: 我们能观察到规律: 一般情况下,表示大的字母在前,小字母在后; 特殊情况下,小字母会在大字母之前,但是相应的,得到 ...
- 3. Spark SQL解析
3.1 新的起始点SparkSession 在老的版本中,SparkSQL提供两种SQL查询起始点,一个叫SQLContext,用于Spark自己提供的SQL查询,一个叫HiveContext,用于连 ...
- winform实现图片的滑动效果
使用winform实现图片的滑动效果(类似网站首页图片滑动切换效果),结果实现了,但是效果其实不是很理想.也许有更好的方法. Timer timerSlide = null; //当前 ...
- jQuery 名称发生冲突怎么办【问题】
[问题]jQuery 名称发生冲突怎么办? [答案]jQuery 使用 $ 符号作为 jQuery 的简介方式.某些其他 JavaScript 库中的函数(比如 Prototype)同样使用 $ 符号 ...
- JAVA基础之Servlet
个人理解: servlet是用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.需要注意的在创建的服务器端的目录和实际上存在差别的,并且访 ...
- Java 之 数据库连接池
一.数据库连接池 1.连接池概念 连接池其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问之 ...
- 在Xcode4 中将iPhone使用的xib转换成iPad使用的xib
来源:http://blog.3snews.net/space.php?uid=6188&do=blog&id=64200 http://www.giser.net/?p=982 1 ...