在学习之前,我们补充一个知识点(static用法)

创建APP

配置:

setting.py

  1. STATICFILES_DIRS = (
  2. os.path.join(BASE_DIR,'static')
  3. )

static 使用:

  1. setting.py中的TEMPLATES:
  1. "django.core.context_processors.static",
  2. Django 会自动把static拿到模板引擎进行渲染,加上这句才能生效
  1. script如下使用:
  1. <script src=/static/js/jquery-2.1.4.min.js></script>
  2. 改成下面的写法:

方式一

  1. <script src="{{ STATIC_URL }}/js/jquery-2.1.4.min.js"></script>

方式二:

  1. {% load staticfiles %}
  2. <script src="{% static 'js/jquery-2.1.4.min.js' %}"></script>

Forms

录入数据举例

通过Form可以在后台提交一个select标签

示例:

目录结构:

forms/home.py

  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. __author__ = 'Allen'
  4. import json
  5. from django import forms
  6. class ImportForm(forms.Form):
  7. HOST_TYPE_LIST = (
  8. (1,'物理机'),
  9. (2,'虚拟机'),
  10. )
  11. host_type = forms.IntegerField(
  12. widget=forms.Select(choices=HOST_TYPE_LIST)
  13. )
  14. hostname = forms.CharField()
  15. fr = open('db_admin')
  16. data = fr.read()
  17. data_tuple = json.loads(data)
  18. admin = forms.IntegerField(
  19. widget=forms.Select(choices=data_tuple)
  20. )
  21. def __init__(self,*args,**kwargs):
  22. super(ImportForm,self).__init__(*args,**kwargs)
  23. fr = open('db_admin')
  24. data = fr.read()
  25. data_tuple = json.loads(data)
  26. self.fields['admin'].widget.choices = data_tuple

views/urls.py

  1. from django.conf.urls import url,include
  2. from django.contrib import admim
  3. from app01.views import account,home
  4. urlpatterns = [
  5. url(r'^index/',home.index),
  6. ]

urls.py

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. url(r'^app01/', include("app01.urls")),
  6. ]

templates/home/index.html

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3. urlpatterns = [
  4. url(r'^admin/', admin.site.urls),
  5. url(r'^app01/', include("app01.urls")),
  6. ]

app01/db_admin

  1. [[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. [[1,"aaa"],[2,"dddd"],[3,"gg"],[4,"ffff"]]

刷新结果如下:

Model

Django中Model(数据库配置)ORM

创建表

基本结构

  1. from django.db import models
  2. class UserInfo(models.Model):
  3. name = models.CharField(max_length=30)
  4. email = models.EmailField()
  5. memo = models.TextField()

更多:

  1. 1models.AutoField  自增列 = int(11)
  2.   如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True
  3. 2models.CharField  字符串字段
  4.   必须 max_length 参数
  5. 3models.BooleanField  布尔类型=tinyint(1)
  6.   不能为空,Blank=True
  7. 4models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  8.   继承CharField,所以必须 max_lenght 参数
  9. 5models.DateField  日期类型 date
  10.   对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
  11. 6models.DateTimeField  日期类型 datetime
  12.   DateField的参数
  13. 7models.Decimal  十进制小数类型 = decimal
  14.   必须指定整数位max_digits和小数位decimal_places
  15. 8models.EmailField  字符串类型(正则表达式邮箱) =varchar
  16.   对字符串进行正则表达式
  17. 9models.FloatField  浮点类型 = double
  18. 10models.IntegerField  整形
  19. 11models.BigIntegerField  长整形
  20.   integer_field_ranges = {
  21.     'SmallIntegerField': (-32768, 32767),
  22.     'IntegerField': (-2147483648, 2147483647),
  23.     'BigIntegerField': (-9223372036854775808, 9223372036854775807),
  24.     'PositiveSmallIntegerField': (0, 32767),
  25.     'PositiveIntegerField': (0, 2147483647),
  26.   }
  27. 12models.IPAddressField  字符串类型(ipv4正则表达式)(已经过时,一般用下面这种)
  28. 13models.GenericIPAddressField  字符串类型(ip4ip6是可选的)
  29.   参数protocol可以是:bothipv4ipv6
  30.   验证时,会根据设置报错
  31. 14models.NullBooleanField  允许为空的布尔类型
  32. 15models.PositiveIntegerFiel  正Integer
  33. 16models.PositiveSmallIntegerField  正smallInteger
  34. 17models.SlugField  减号、下划线、字母、数字
  35. 18models.SmallIntegerField  数字
  36.   数据库中的字段有:tinyintsmallintintbigint
  37. 19models.TextField  字符串=longtext
  38. 20models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
  39. 21models.URLField  字符串,地址正则表达式
  40. 22models.BinaryField  二进制
  41. 23models.ImageField 图片
  42. 24models.FilePathField 文件

上面那么多,常见的有如下几种:

  1. models.CharField  字符串字段
  2. models.BooleanField  布尔类型=tinyint(1)
  3. models.DateField  日期类型 date
  4. models.DateTimeField  日期类型 datetime
  5. models.EmailField  字符串类型(正则表达式邮箱) =varchar
  6. models.IPAddressField  字符串类型(ip4正则表达式) 这个已经过时了,只是针对ipv4
  7. models.GenericIPAddressField  字符串类型(ip4ip6是可选的)
  8. models.ImageField 图片 (以下两种虽然写着存图片和文件,但是在数据库存的还是字符串)
  9. models.FilePathField 文件

更多参数

  1. 1null=True
  2.   数据库中字段是否可以为空
  3. 2blank=True
  4.   django Admin 中添加数据时是否可允许空值
  5. 3primary_key = False
  6.   主键,对AutoField设置主键后,就会代替原来的自增 id
  7. 4auto_now auto_now_add
  8.   auto_now 自动创建---无论添加或修改,都是当前操作的时间
  9.   auto_now_add 自动创建---永远是创建时的时间
  10. 5choices
  11. GENDER_CHOICE = (
  12. (u'M', u'Male'),
  13. (u'F', u'Female'),
  14. )
  15. gender = models.CharField(max_length=2,choices = GENDER_CHOICE)
  16. 6max_length
  17. 7default  默认值
  18. 8verbose_name  Admin中字段的显示名称
  19. 9name|db_column  数据库中的字段名称
  20. 10unique=True  不允许重复
  21. 11db_index = True  数据库索引
  22. 12editable=True  在Admin里是否可编辑
  23. 13error_messages=None  错误提示
  24. 14auto_created=False  自动创建
  25. 15help_text  在Admin中提示帮助信息
  26. 16validators=[]
  27. 17upload-to

models

示例

models.py

  1. from django.db import models
  2. # Create your models here.
  3. class UserInfo(models.Model):
  4. name = models.CharField(max_length=24)
  5. ctime = models.DateTimeField(auto_now=True)
  6. uptime = models.DateTimeField(auto_now_add=True)
  7. email = models.EmailField(max_length=24,null=True)
  8. email2 = models.EmailField(max_length=24,default="yyh@sina.com")
  9. ip = models.GenericIPAddressField(protocol="ipv4",null=True,blank=True)
  10. img = models.ImageField(null=True,blank=True,upload_to="upload")
  11. #img 中null=True,表示在数据库存的时可以为空,blank=True,表示admin后台设置时可以为空,upload_to,指定上传路径

admin

示例:

admin.py

  1. from django.contrib import admin
  2. from app01 import models
  3. admin.site.register(models.UserInfo)

访问数据库添加数据:

http://127.0.0.1/admin

当随便输入,邮件格式不对时,会自动提醒:

同时,如果我们在img中上传了图片,图片会保存在根目录下(目录可自己指定,我这里指定了upload路径,没有则会自动创建这个目录)

上传文件示例:

home/upload.html

  1. <form action="/app01/upload/" method="post" enctype="multipart/form-data">
  2. <p><input type="file" name="f1"/></p>
  3. <!--<p><input type="file" name="f2"/></p>-->
  4. <p><input type="text" name="hostname"/></p>
  5. <p><input type="submit" value="Upload"/></p>
  6. </form>

views/home.py

  1. def upload(request):
  2. if request.method == "POST":
  3. inp_post = request.POST
  4. inp_files = request.FILES
  5. file_obj = inp_files.get('f1')
  6. print file_obj.name
  7. f = open(file_obj.name,'wb')
  8. for line in file_obj.chunks():
  9. f.write(line)
  10. f.close()
  11. return render(request,'home/upload.html')

app01/urls.py

  1. from django.conf.urls import url,include
  2. from django.contrib import admin
  3. from app01.views import account,home
  4. urlpatterns = [
  5. url(r'^upload/',home.upload),
  6. ]

访问方式:

http://127.0.0.1/app01/upload/

上传文件,如果没有指定上传路径,则默认上传在根目录下

分页:

原始做法:

models.py

  1. from django.db import models
  2. class UserList(models.Model):
  3. username = models.CharField(max_length=32)
  4. age = models.IntegerField()

views.py

  1. def user_list(request):
  2. ## 刚开始时,需要把下面的注释打开,生成一些数据
  3. # for item in range(100):
  4. # temp = {'username':"name_%d" % item,'age':item}
  5. # models.UserList.objects.create(**temp)
  6. # print models.UserList.objects.all().count()
  7. current_page = request.GET.get('page',1)
  8. current_page = int(current_page)
  9. start = (current_page - 1)*10
  10. end = current_page * 10
  11. result = models.UserList.objects.all()[start:end]
  12. return render(request,'user_list.html',{"result":result})

urls.py

  1. from app01 import views
  2. urlpatterns = [
  3. url(r'^admin/', admin.site.urls),
  4. url(r'^user_list/', views.user_list),
  5. ]

user_list.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <table>
  9. {% for line in result %}
  10. <tr>
  11. <td>{{ line.username }}</td>
  12. <td>{{ line.age }}</td>
  13. </tr>
  14. {% endfor %}
  15. </table>
  16. </body>
  17. </html>
访问方式:
  1. http://127.0.0.1:9001/user_list/?page=1
  2. page=1page=2page=...

访问结果:

改良版:

views.py

  1. #!/usr/bin/env python
  2. #-*- coding:utf-8 -*-
  3. from django.shortcuts import render
  4. from app01 import models
  5. class Pager(object):
  6. def __init__(self,current_page):
  7. self.current_page = int(current_page)
  8. @property
  9. def start(self):
  10. return (self.current_page-1)*10
  11. @property
  12. def end(self):
  13. return (self.current_page)*10
  14. def user_list(request):
  15. current_page = request.GET.get('page',1)
  16. page_obj = Pager(current_page)
  17. result = models.UserList.objects.all()[page_obj.start:page_obj.end]
  18. #每页显示10条数据
  19. #共100页
  20. all_item = models.UserList.objects.all().count()
  21. all_page,div = divmod(all_item,10)
  22. if div>0:
  23. all_page += 1
  24. pager_str = ""
  25. for i in range(1,all_page+1):
  26. temp = '<a href="/user_list/?page=%d">%d</a>' % (i,i,)
  27. pager_str += temp
  28. return render(request,'user_list.html',{"result":result,'pager_str':pager_str})

user_list.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <table>
  9. {% for line in result %}
  10. <tr>
  11. <td>{{ line.username }}</td>
  12. <td>{{ line.age }}</td>
  13. </tr>
  14. {% endfor %}
  15. </table>
  16. <div>
  17. {{ pager_str|safe }}
  18. </div>
  19. </body>
  20. </html>
其他不变,访问如下:
  1. http://127.0.0.1:9001/user_list/
截图如下:

点击相应页面出现相应内容:

更多链接:http://www.cnblogs.com/wupeiqi/articles/5246483.html

Django进阶篇【2】的更多相关文章

  1. 02:Django进阶篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  2. Django进阶篇【1】

    注:本篇是Django进阶篇章,适合人群:有Django基础,关于Django基础篇,将在下一章节中补充! 首先我们一起了解下Django整个请求生命周期: Django 请求流程,生命周期: 路由部 ...

  3. django 进阶篇

    models(模型) 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetLi ...

  4. python Django 进阶篇

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  5. Python之路【第十七篇】Django进阶篇

    规范 确立规范的好处: 代码可读性高 方便代码的定位极其查找 为以后代码扩容带来便利 场景: 在多个APP的场景下,单个app的URL函数功能较多的时候,我们可以通过以下方法来解决. 把Views写成 ...

  6. django进阶篇

    原文连接:http://www.cnblogs.com/wupeiqi/articles/5246483.html Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创 ...

  7. Python学习-day20 django进阶篇

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  8. Django进阶篇(二)

    中间件 解析 django 中的中间件(middleware),在django中,中间件其实就是一个类,在请求到来和结束后, django会根据自己的规则在合适的时机执行中间件中相应的方法. 在dja ...

  9. Python之路【第十六篇续】Django进阶篇

    Django请求生命周期 首先:对于所有的web框架来说本质就是一个socket服务端,浏览器是socket客户端 路由系统 在Django的urls中我们可以根据一个URL对应一个函数名来定义路由规 ...

  10. Django进阶篇(一)

    Form django中的Form一般有两种功能: 1.输入html 2.验证用户输入 最简易的form验证: <!DOCTYPE html> <html lang="en ...

随机推荐

  1. Grails笔记四:Groovy特性小结

    在学习Grails的时候与Groovy打交道不可避免,虽然不必太深刻,但多知道一些特性也是很有帮助的~ 1.相除后获取整数 使用intdiv()方法可以获得整数,注意点是这个方法只适用两个整数相除,浮 ...

  2. 几个常用EL表达式的用法

    转载至  http://yqsshr.blog.51cto.com/469059/131824 1,用来获取表单数据  param 和 paramValues 1.jsp 的有如下表单 <for ...

  3. java 多线程Callable和Runable执行顺序问题详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt125 毫无疑问 Runnable会进行异步执行,此处不多说,主要说明Call ...

  4. jdbc预编译

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp20 JAVA_JDBC预编译 相关知识点 什么是预编译语句? 预编译语句P ...

  5. Python输入输出练习,运算练习,turtle初步练习

    Hello World! 简单交互(交互式,文件式)教材P19 radius=25 area=3.1415*radius*radius print(area) print('{:.2f}'.forma ...

  6. vs 2015 rdlc报表绑定datagridview中的数据

    这几天一直想要实现rdlc报表绑定datagridview中的数据,始终在虚拟表向rdlc报表绑定这一步上出错.今天从下午4点到七点四十一直在尝试.最终还是实现了,最然并不知所以然,这个问题还是以后在 ...

  7. 结对编程-四则运算-GUI

     201421123022 王若凡        201421123026  欧阳勇 https://git.coding.net/ttoyy/sizeyunsuan-GUI.git a.需求分析: ...

  8. 201521123002 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 2. 书面作业 作业参考文件下载 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能 ...

  9. 《JAVA程序设计》第11周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. synchronized方法/代码块 wait().notify()用法,生产者消费者例子 lock.condit ...

  10. 工厂模式 and 单例模式

    工厂模式:使用工厂类使创建类与使用类分离,从而提高代码的易维护性,可扩展性等 工厂模式分位简单工厂模式和工厂方法模式 使用简单工厂模式的步骤:     1.创建父类及其子类         父类中有[ ...