Django进阶篇【2】
在学习之前,我们补充一个知识点(static用法)
创建APP
配置:
setting.py
STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static')
)
static 使用:
- setting.py中的TEMPLATES:
"django.core.context_processors.static",
Django 会自动把static拿到模板引擎进行渲染,加上这句才能生效
- script如下使用:
<script src=/static/js/jquery-2.1.4.min.js></script>
改成下面的写法:
方式一
<script src="{{ STATIC_URL }}/js/jquery-2.1.4.min.js"></script>
方式二:
{% load staticfiles %}
<script src="{% static 'js/jquery-2.1.4.min.js' %}"></script>
Forms
录入数据举例
通过Form可以在后台提交一个select标签
示例:
目录结构:
forms/home.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
__author__ = 'Allen'
import json
from django import forms
class ImportForm(forms.Form):
HOST_TYPE_LIST = (
(1,'物理机'),
(2,'虚拟机'),
)
host_type = forms.IntegerField(
widget=forms.Select(choices=HOST_TYPE_LIST)
)
hostname = forms.CharField()
fr = open('db_admin')
data = fr.read()
data_tuple = json.loads(data)
admin = forms.IntegerField(
widget=forms.Select(choices=data_tuple)
)
def __init__(self,*args,**kwargs):
super(ImportForm,self).__init__(*args,**kwargs)
fr = open('db_admin')
data = fr.read()
data_tuple = json.loads(data)
self.fields['admin'].widget.choices = data_tuple
views/urls.py
from django.conf.urls import url,include
from django.contrib import admim
from app01.views import account,home
urlpatterns = [
url(r'^index/',home.index),
]
urls.py
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include("app01.urls")),
]
templates/home/index.html
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^app01/', include("app01.urls")),
]
app01/db_admin
[[1,"aaa"],[2,"dddd"],[3,"gg"]] #因为要用json,所以中括号里面一定是双引号
访问方式:
http://127.0.0.1:9001/app01/home/
访问结果:
当我们在db_admin更一条数据,数据会重新执行forms/home.py 中的__init__函数(如果没有__init__函数,则需要重新才会生效)
下面在db_admin中手动添加一个记录
db_admin中新增了[4,"ffff"]:
[[1,"aaa"],[2,"dddd"],[3,"gg"],[4,"ffff"]]
刷新结果如下:
Model
Django中Model(数据库配置)ORM
创建表
基本结构
from django.db import models
class UserInfo(models.Model):
name = models.CharField(max_length=30)
email = models.EmailField()
memo = models.TextField()
更多:
1、models.AutoField 自增列 = int(11)
如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField 字符串字段
必须 max_length 参数
3、models.BooleanField 布尔类型=tinyint(1)
不能为空,Blank=True
4、models.ComaSeparatedIntegerField 用逗号分割的数字=varchar
继承CharField,所以必须 max_lenght 参数
5、models.DateField 日期类型 date
对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField 日期类型 datetime
同DateField的参数
7、models.Decimal 十进制小数类型 = decimal
必须指定整数位max_digits和小数位decimal_places
8、models.EmailField 字符串类型(正则表达式邮箱) =varchar
对字符串进行正则表达式
9、models.FloatField 浮点类型 = double
10、models.IntegerField 整形
11、models.BigIntegerField 长整形
integer_field_ranges = {
'SmallIntegerField': (-32768, 32767),
'IntegerField': (-2147483648, 2147483647),
'BigIntegerField': (-9223372036854775808, 9223372036854775807),
'PositiveSmallIntegerField': (0, 32767),
'PositiveIntegerField': (0, 2147483647),
}
12、models.IPAddressField 字符串类型(ipv4正则表达式)(已经过时,一般用下面这种)
13、models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
参数protocol可以是:both、ipv4、ipv6
验证时,会根据设置报错
14、models.NullBooleanField 允许为空的布尔类型
15、models.PositiveIntegerFiel 正Integer
16、models.PositiveSmallIntegerField 正smallInteger
17、models.SlugField 减号、下划线、字母、数字
18、models.SmallIntegerField 数字
数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField 字符串=longtext
20、models.TimeField 时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField 字符串,地址正则表达式
22、models.BinaryField 二进制
23、models.ImageField 图片
24、models.FilePathField 文件
上面那么多,常见的有如下几种:
models.CharField 字符串字段
models.BooleanField 布尔类型=tinyint(1)
models.DateField 日期类型 date
models.DateTimeField 日期类型 datetime
models.EmailField 字符串类型(正则表达式邮箱) =varchar
models.IPAddressField 字符串类型(ip4正则表达式) 这个已经过时了,只是针对ipv4
models.GenericIPAddressField 字符串类型(ip4和ip6是可选的)
models.ImageField 图片 (以下两种虽然写着存图片和文件,但是在数据库存的还是字符串)
models.FilePathField 文件
更多参数
1、null=True
数据库中字段是否可以为空
2、blank=True
django的 Admin 中添加数据时是否可允许空值
3、primary_key = False
主键,对AutoField设置主键后,就会代替原来的自增 id 列
4、auto_now 和 auto_now_add
auto_now 自动创建---无论添加或修改,都是当前操作的时间
auto_now_add 自动创建---永远是创建时的时间
5、choices
GENDER_CHOICE = (
(u'M', u'Male'),
(u'F', u'Female'),
)
gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
6、max_length
7、default 默认值
8、verbose_name Admin中字段的显示名称
9、name|db_column 数据库中的字段名称
10、unique=True 不允许重复
11、db_index = True 数据库索引
12、editable=True 在Admin里是否可编辑
13、error_messages=None 错误提示
14、auto_created=False 自动创建
15、help_text 在Admin中提示帮助信息
16、validators=[]
17、upload-to
models
示例
models.py
from django.db import models
# Create your models here.
class UserInfo(models.Model):
name = models.CharField(max_length=24)
ctime = models.DateTimeField(auto_now=True)
uptime = models.DateTimeField(auto_now_add=True)
email = models.EmailField(max_length=24,null=True)
email2 = models.EmailField(max_length=24,default="yyh@sina.com")
ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True)
img = models.ImageField(null=True,blank=True,upload_to="upload")
#img 中null=True,表示在数据库存的时可以为空,blank=True,表示admin后台设置时可以为空,upload_to,指定上传路径
admin
示例:
admin.py
from django.contrib import admin
from app01 import models
admin.site.register(models.UserInfo)
访问数据库添加数据:
http://127.0.0.1/admin
当随便输入,邮件格式不对时,会自动提醒:
同时,如果我们在img中上传了图片,图片会保存在根目录下(目录可自己指定,我这里指定了upload路径,没有则会自动创建这个目录)
上传文件示例:
home/upload.html
<form action="/app01/upload/" method="post" enctype="multipart/form-data">
<p><input type="file" name="f1"/></p>
<!--<p><input type="file" name="f2"/></p>-->
<p><input type="text" name="hostname"/></p>
<p><input type="submit" value="Upload"/></p>
</form>
views/home.py
def upload(request):
if request.method == "POST":
inp_post = request.POST
inp_files = request.FILES
file_obj = inp_files.get('f1')
print file_obj.name
f = open(file_obj.name,'wb')
for line in file_obj.chunks():
f.write(line)
f.close()
return render(request,'home/upload.html')
app01/urls.py
from django.conf.urls import url,include
from django.contrib import admin
from app01.views import account,home
urlpatterns = [
url(r'^upload/',home.upload),
]
访问方式:
http://127.0.0.1/app01/upload/
上传文件,如果没有指定上传路径,则默认上传在根目录下
分页:
原始做法:
models.py
from django.db import models
class UserList(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
views.py
def user_list(request):
## 刚开始时,需要把下面的注释打开,生成一些数据
# for item in range(100):
# temp = {'username':"name_%d" % item,'age':item}
# models.UserList.objects.create(**temp)
# print models.UserList.objects.all().count()
current_page = request.GET.get('page',1)
current_page = int(current_page)
start = (current_page - 1)*10
end = current_page * 10
result = models.UserList.objects.all()[start:end]
return render(request,'user_list.html',{"result":result})
urls.py
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^user_list/', views.user_list),
]
user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<table>
{% for line in result %}
<tr>
<td>{{ line.username }}</td>
<td>{{ line.age }}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
访问方式:
http://127.0.0.1:9001/user_list/?page=1
page=1,page=2,page=...
访问结果:
改良版:
views.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-
from django.shortcuts import render
from app01 import models
class Pager(object):
def __init__(self,current_page):
self.current_page = int(current_page)
@property
def start(self):
return (self.current_page-1)*10
@property
def end(self):
return (self.current_page)*10
def user_list(request):
current_page = request.GET.get('page',1)
page_obj = Pager(current_page)
result = models.UserList.objects.all()[page_obj.start:page_obj.end]
#每页显示10条数据
#共100页
all_item = models.UserList.objects.all().count()
all_page,div = divmod(all_item,10)
if div>0:
all_page += 1
pager_str = ""
for i in range(1,all_page+1):
temp = '<a href="/user_list/?page=%d">%d</a>' % (i,i,)
pager_str += temp
return render(request,'user_list.html',{"result":result,'pager_str':pager_str})
user_list.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<table>
{% for line in result %}
<tr>
<td>{{ line.username }}</td>
<td>{{ line.age }}</td>
</tr>
{% endfor %}
</table>
<div>
{{ pager_str|safe }}
</div>
</body>
</html>
其他不变,访问如下:
http://127.0.0.1:9001/user_list/
截图如下:
点击相应页面出现相应内容:
更多链接:http://www.cnblogs.com/wupeiqi/articles/5246483.html
Django进阶篇【2】的更多相关文章
- 02:Django进阶篇
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- Django进阶篇【1】
注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...
- django 进阶篇
models(模型) 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetLi ...
- python Django 进阶篇
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- Python之路【第十七篇】Django进阶篇
规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...
- django进阶篇
原文连接:http://www.cnblogs.com/wupeiqi/articles/5246483.html Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创 ...
- Python学习-day20 django进阶篇
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- Django进阶篇(二)
中间件 解析 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后, django会根据自己的规则在合适的时机执行中间件中相应的方法. 在dja ...
- Python之路【第十六篇续】Django进阶篇
Django请求生命周期 首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端 路由系统 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规 ...
- Django进阶篇(一)
Form django中的Form一般有两种功能: 1.输入html 2.验证用户输入 最简易的form验证: <!DOCTYPE html> <html lang="en ...
随机推荐
- 解决:"不再sudoers文件中,此事将不做被报告”的问题
使用sudo出现问题:不再sudoers文件中,此事将不做被报告 系统:win8.1 +cents 7 问题:在虚拟机中,默认不是root账号,在使用sudo命令时候收到下面警告: sudo命令含义: ...
- List,map,Set区别
List按对象进入的顺序保存对象,不做排序或编辑操作.Set对每个对象只接受一次,并使用自己内部的排序方法(通常,你只关心某个元素是否属于Set,而不关心它的顺序--否则应该使用List).Map同样 ...
- 结对作业-基于GUI的四则运算
一.需求分析 1.题目要求: 我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序.进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web ...
- 团队作业7——Alpha冲刺之事后诸葛亮(宣告项目失败团队解散)
一.项目进度 1.4月5日,团队组建.满怀希望的能做好这个项目 2.4月12日,需求分析. 3.4月21日,需求改进,出现协作问题,没有做好. 4.做项目,学习新的知识,继续做项目,但是能力有限,团队 ...
- 【Beta阶段】第七次scrum meeting
Coding/OSChina 地址 1. 会议内容 学号 主要负责的方向 昨日任务 昨日任务完成进度 接下去要做 99 PM 配合100完成联网功能 100% 设置个人中心的设计 100 DEV 开始 ...
- Swing-JMenu菜单用法-入门
菜单是Swing客户端程序不可获取的一个组件.窗体菜单大致由菜单栏.菜单和菜单项三部分组成,如下图所示: 由图可见,对于一个窗体,首先要添加一个JMenuBar,然后在其中添加JMenu,在JMenu ...
- 团队作业4——第一次项目冲刺(Alpha版本) 2017.4.23
本次会议为第二次Scrum Meeting会议~ 由于本次会议项目经理召开时间为10:30,在五社区会五号楼召开,召开时长约30分钟,对昨天的工作进行了总结并分配了今天的任务. 1.站立式会议照片(拍 ...
- 201521123062《Java程序设计》第6周学习总结
1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. 2. 书面作业 Q1.clone方法 1.1 Object ...
- 201521123003《Java程序设计》第2周学习总结
1. 本章学习总结 你对于本章知识的学习总结 学习了java中各种数据类型的使用 掌握了基本类型的转换 了解string和stringbuilder的区别以及字符串池的原理 学会了使用package管 ...
- 201521123025《java程序设计》第10周学习总结
1. 本周学习总结 2. 书面作业 Q1.finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 4-2中finally中捕获异常需要注意什么? 只有执行过try语句块,finall ...