一、urls.py中name属性的作用 urls.py urlpatterns = [ url(r'^$', calc_views.index, name='home'), url(r'^add/$', calc_views.add, name='add'), url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'), url(r'^admin/', admin.site.urls), ] 模板对url的渲染 不带参数的: {% url 'name' %} 带参数的:参数可以是变量名 {% url 'name' 参数 %} 例如: link 渲染后: link 当urls.py的url修改后如: url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'), 模板文件直接渲染成: link 这样只用改变urls.py,模板全部url都能渲染出来(建议用这种方式,而不是模板写死url) 二、modules.py数据库增删改查,及数据库关系映射 settings.py数据库配置(mysql为例) DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'books', #你的数据库名称 'USER': 'root', #你的数据库用户名 'PASSWORD': '', #你的数据库密码 'HOST': '', #你的数据库主机,留空默认为localhost 'PORT': '3306', #你的数据库端口 } 注意: 因为django默认你导入的驱动是MySQLdb,可是MySQLdb对于py3有很大问题,所以我们需要的驱动是PyMySQL 所以,我们只需要找到项目名文件下的__init__,在里面写入: import pymysql pymysql.install_as_MySQLdb() ORM表模型包含: 一对一,一对多,多对多 例子: 表(模型)的创建: 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名。 作者详细模型:把作者的详情放到详情表,包含性别,email地址和出生日期,作者详情模型和作者模 型之间是一对一的关系(one-to-one)(类似于每个人和他的×××之间的关系),在大多数情况下 我们没有必要将他们拆分成两张表,这里只是引出一对一的概念。 出版商模型:出版商有名称,地址,所在城市,省,国家和网站。 书籍模型:书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和 书籍的关系就是多对多的关联关系(many-to-many),一本书只应该由一个出版商出版,所以出版商 和书籍是一对多关联关系(one-to-many),也被称作外键。 from django.db import models
class Publisher(models.Model): name = models.CharField(max_length=30, verbose_name="名称") address = models.CharField("地址", max_length=50) city = models.CharField('城市',max_length=60) state_province = models.CharField(max_length=30) country = models.CharField(max_length=50) website = models.URLField() class Meta: verbose_name = '出版商' verbose_name_plural = verbose_name def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=30) def __str__(self): return self.name class AuthorDetail(models.Model): sex = models.BooleanField(max_length=1, choices=((0, '男'),(1, '女'),)) email = models.EmailField() address = models.CharField(max_length=50) birthday = models.DateField() author = models.OneToOneField(Author) class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2,default=10) def __str__(self): return self.title 分析: <1>每个数据模型都是django.db.models.Model的子类,它的父类Model包含了所有必要的和数据库交 互的方法。并提供了一个简介漂亮的定义数据库字段的语法。 <2>每个模型相当于单个数据库表(多对多关系例外,会多生成一张关系表),每个属性也是这个表中 的字段。属性名就是字段名,它的类型(例如CharField)相当于数据库的字段类型(例如varchar)。大家可以留意下其它的类型都和数据库里的什么字段对应。 <3>模型之间的三种关系:一对一,一对多,多对多。 一对一:实质就是在主外键(author_id就是foreign key)的关系基础上,给外键加了一个 UNIQUE=True的属性; 一对多:就是主外键关系;(foreign key) 多对多:(ManyToManyField) 自动创建第三张表(当然我们也可以自己创建第三张表:两个foreign key) 增删改查: 增: #create方式一: Author.objects.create(name='Alvin') #create方式二: Author.objects.create(**{"name":"alex"}) #save方式一: author=Author(name="alvin") author.save() #save方式二: author=Author() author.name="alvin" author.save()
#一对多(ForeignKey): #方式一: 由于绑定一对多的字段,比如publish,存到数据库中的字段名叫publish_id,所以我们可以直接给这个 # 字段设定对应值: Book.objects.create(title='php', publisher_id=2, #这里的2是指为该book对象绑定了Publisher表中id=2的行对象 publication_date='2017-7-7', price=99) #方式二: # <1> 先获取要绑定的Publisher对象: pub_obj=Publisher(name='河大出版社',address='保定',city='保定', state_province='河北',country='China',website='http://www.hbu.com') OR pub_obj=Publisher.objects.get(id=1) # <2>将 publisher_id=2 改为 publisher=pub_obj #多对多(ManyToManyField()): author1=Author.objects.get(id=1) author2=Author.objects.filter(name='alvin')[0] book=Book.objects.get(id=1) book.authors.add(author1,author2) #等同于: book.authors.add(*[author1,author2]) book.authors.remove(*[author1,author2]) #------------------- book=models.Book.objects.filter(id__gt=1) authors=models.Author.objects.filter(id=1)[0] authors.book_set.add(*book) authors.book_set.remove(*book) #------------------- book.authors.add(1) book.authors.remove(1) authors.book_set.add(1) authors.book_set.remove(1) #注意: 如果第三张表是通过models.ManyToManyField()自动创建的,那么绑定关系只有上面一种方式# 如果第三张表是自己创建的: class Book2Author(models.Model): author=models.ForeignKey("Author") Book= models.ForeignKey("Book")# 那么就还有一种方式: author_obj=models.Author.objects.filter(id=2)[0] book_obj =models.Book.objects.filter(id=3)[0] s=models.Book2Author.objects.create(author_id=1,Book_id=2) s.save() s=models.Book2Author(author=author_obj,Book_id=1) s.save()
删: Book.objects.filter(id=1).delete() 改: 方法一 Book.objects.filter(id=3).update(title="PHP") 方法二 obj=models.Book.objects.filter(id=3)[0] obj.title="Python" obj.save() 效率低,需要所有属性从新设定一遍 查询api: # <1>filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 # <2>all(): 查询所有结果 # <3>get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合 筛选条件的对象超过一个或者没有都会抛出错误。 #-----------下面的方法都是对查询的结果再进行处理:比如 objects.filter.values()-------- # <4>values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是 一系列 model的实例化对象,而是一个可迭代的字典序列 # <5>exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 # <6>order_by(*field): 对查询结果排序 # <7>reverse(): 对查询结果反向排序 # <8>distinct(): 从返回结果中剔除重复纪录 # <9>values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一 个字典序列# <10>count(): 返回数据库中匹配查询(QuerySet)的对象数量。 # <11>first(): 返回第一条记录 # <12>last(): 返回最后一条记录 # <13>exists(): 如果QuerySet包含数据,就返回True,否则返回False ---------------了不起的双下划线(__)之单表条件查询---------------- # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值# # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in# # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感# # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and# # startswith,istartswith, endswith, iendswith,
三、模板 过滤器filter {% url %} 引用路由配置的地址禁止render渲染 {% verbatim %} {{ hello }} {% endverbatim %} 加载标签库,自定义filter和simple_tag a、在app中创建templatetags模块(必须的) b、创建任意 .py 文件,如:my_tags.py from django import templatefrom django.utils.safestring import mark_safe register = template.Library() #register的名字是固定的,不可改变 @register.filter def filter_multi(v1,v2): return v1 * v2 @register.simple_tag def simple_tag_multi(v1,v2): return v1 * v2 @register.simple_tag def my_input(id,arg): result = "" %(id,arg,) return mark_safe(result) c、在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %} d、使用simple_tag和filter(如何调用) -------------------------------.html {% load xxx %} #首行 # num=12{{ num|filter_multi:2 }} #24{{ num|filter_multi:"[22,333,4444]" }} {% simple_tag_multi 2 5 %} 参数不限,但不能放在if for语句中 {% simple_tag_multi num 5 %} e、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 注意: filter可以用在if等语句后,simple_tag不可以 {% if num|filter_multi:30 > 100 %} {{ num|filter_multi:30 }} {% endif %} extend模板继承 定义基础模板base.html
My helpful timestamp site
{% block content %}{% endblock %} {% block footer %}Thanks for visiting my site.
{% endblock %} 继承基础模板 {% extends "base.html" %} {% block title %}The current time{% endblock %} {% block content %}It is now {{ current_date }}.
{% endblock %}