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的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数. 今天和群友们讨论了一个问 ...
随机推荐
- sql查询出现1055 this is incompatible with sql_mode=only_full_group_by
今天在测试服务器上突然出现了这么一个MySQL的问题,同样的代码正式服没有问题,那肯定就是出在了配置上,查了一下原因才明白原来是数据库版本为5.7以上的版本, 默认是开启了 only_full_gro ...
- Ubuntu遇到apt-get update报错:"E: Could not get lock /var/lib/apt/lists/lock"
sudo apt-get update报错:"E: Could not get lock /var/lib/apt/lists/lock" 出现此问题的原因可能是有另外一个程序在运 ...
- Markdown新手入门
目录 Markdown新手入门 一.字体样式 二. 标题 三.列表 四.引用和代码块 五.插入图片和超链接 六.创建表格 七. 上标和下标 八.着重显示和高亮显示 我是尾巴 Markdown新手入门 ...
- idea常用插件安装
1.IDEA Restart IDEA没有重启的选项,这个工具就是来弥补这个功能,可以在File-->Restart 重启,也可以使用快捷键 CTRL + ALT + R 2.Maven He ...
- vue 项目中assets 和static的区别
一.Webpacked Assets 为了回答这个问题,我们首先需要了解Webpack如何处理静态资产.在 *.vue 组件中,所有模板和CSS都会被 vue-html-loader 及 css-lo ...
- 解决Windows10关闭UAC后,开机启动项不生效的问题
Windows10关闭UAC后,会发现启动项不生效. 运行输入gpedit.msc打开组策略(家庭版没有组策略功能) 依次展开计算机配置->Windows设置->安全设置->本地策略 ...
- java之struts2之数据检验
1.使用struts2时,有时候需要对数据进行相关的验证.如果对数据的要求比较严格,或对安全性要求比较高时,前端 js 验证还不够, 需要在后端再进行一次验证,保证数据的安全性. 2.struts2提 ...
- java后台获取微信小程序openid
一.jar包准备 1.在网盘下载 链接:https://pan.baidu.com/s/15HAAWOg_yn768g4s9IrcPg 提取码:hgj0 二.在pom文件中添加依赖 1.将外部的引入的 ...
- 使用gdb调试应用程序
目录 一.gdb基本使用 1. 启动gdb 2. gdb交互式命令 一.gdb基本使用 GDB是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具. ...
- [极客-Linux] 05 系统调用
分配内存的系统调用 1)brk 小内存 2)mmap 大内存 sigaction 注册信号处理函数 进程间通信: 1)消息队列,在内核中,msgget 创建 2)共享内存,shmget 内核源代码 ...