一、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 %}
引用路由配置的地址

          
          
          {%csrf_token%}
          
禁止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



    {% block title %}{% endblock %}


    

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 %}