6陆、django之模型层(model)–多表相关操作(图书管理小演习)

 

在文书最后 STATIC_URL = ‘/static/’ 后添加

View
Code

前三行也是固定的不可更改

图书、出版社、作者

即便那种技能便利解释视图是何等工作的,但直接将HTML硬编码到您的视图里却并不是一个好处理格局。

壹)创造一个类别

 

创制二个新的对象,保存对象,并将它添加到关联对象集之中。重返新创建的靶子。

在那么些事例中, block 标签定义了四个能够被子模版内容填充的block。 block 告诉模版引擎:
子模版大概会覆盖掉模版中的那么些岗位。

Django
还提供了1种直观而敏捷的点子在查询中代表关联关系那就是无往不胜的双划线

模版层(template)

 

修改和从前的相同依然update比较不难就不做详细分解了一贯上实例

在您的花色里新建文件夹static

三)修改相关setting配置。(详情能够参照前边6三、6四、陆伍3篇小说)

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

图片 1图片 2

那会儿,模版引擎将注意到 base.html 中的八个 block 标签,并用子模版中的内容来替换那些block。依据 blog_entries 的值,覆盖后看起来是如此的:

book_obj.authorlish.remove()     # 将某个特定的对象从被关联对象集合中去除。    ======   book_obj.authors.remove(*[])
book_obj.authorlish.clear()       #清空被关联对象集合。

 

1)add

一、模版简介

一定因为没用使用不做示范
用法与其余七个事关相同

能够使用{% for obj in list reversed %}反向落成循环。


这么些模版,大家把它叫作 base.html
它定义了二个方可用来两列排版页面包车型大巴简要HTML骨架。“子模版”的行事是用它们的内容填充空的blocks。

<div class="table-responsive table-bordered">
    <table class="table table-striped" id="student">
    {% block content %}
        <thead>
        <div class="row">
            {% block th %}
                <tr>
                    <th>编号</th>
                    <th>书名</th>
                    <th>作者</th>
                    <th>出版日期</th>
                    <th>价格</th>
                    <th>出版社</th>
                    <th>操作</th>
                </tr>
            {% endblock th %}
        </div>
        </thead>
        <tbody>
            {% block td %}
                {% for book_obj in bookList %}
                    <tr>
                        <td>{{ forloop.counter}}</td>
                        <td>{{ book_obj.title }}</td>
                        <td>
                            {% for author in book_obj.authorlish.all %}
                                {{ author.name }}
                            {% endfor %}
                        </td>
                        <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
                        <td>{{ book_obj.prince }}</td>
                        <td>{{ book_obj.publish.name }}</td>
                        <td>
                           <a href="/editbook/{{ book_obj.id }}"><button class="btn btn-info">编辑</button></a>
                           <a href="/delbook/{{ book_obj.id }}"><button class="btn btn-danger">删除</button></a>
                        </td>
                    </tr>
                {% endfor %}
            {% endblock td %}
        </tbody>
    {% endblock content %}
    </table>
</div>

1)view:

在 Django 删除对象时,会效仿 SQL 约束 ON
DELETE CASCADE
的作为,换句话说,删除1个对象时也会删除与它相关联的外键对象。

以bootstrap-三.叁.7文件为例

annotate的再次来到值是querySet

自定义标签和过滤器进度:

三、查询实例

一、在大家从前写的代码还有未有纪念最终回来是一个网页(上篇随笔)

1)主键id 字段是活动抬高的

3)假如你意识你协调在大气的模板中复制内容,那只怕意味着你应当把内容移动到母版中的贰个 {% block %} 中。

 

 

models.book.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值

models.book.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
models.book.objects.exclude(id__in=[11, 22, 33])  # not in

models.book.objects.filter(name__contains="ven")  #模糊匹配
models.book.objects.filter(name__icontains="ven") # icontains大小写不敏感

models.book.objects.filter(id__range=[1, 2])      # 范围bettwen and

startswith,istartswith, endswith, iendswith 

瞩目:句点符只好够用来引用对象的无参数方法

图片 3图片 4


b = Blog.objects.get(id=1)
e = Entry.objects.get(id=234)
b.entry_set.add(e)
{{ t|date:"Y-m-d" }}
一对一:
models.OneToOneField() ===>models.ForeignKey(,unique="True")
一对多:
models.ForeignKey()
多对多:
models.ManyToManyField()

属性:
related_name=""    
可选属性用来给此次关联起名,如果不用此属性django会自动给一个名字后面查询的例子会说明(是关联的名字不是字段名)

再次来到值的尺寸。它对字符串和列表都起效果。例如:

def delbook(request,id) :
    # 删除图书
    models.Book.objects.filter(id=id).delete()
    return redirect("/index/")
from django.shortcuts import render,HttpResponse

def timeHandle(request):
    import datetime
    t=datetime.datetime.now()

    from django.template import Template, Context
    templateObj=Template("<h1 style='color:red'>current time: {{ time }}</h1>")
    contextObj=Context({"time":str(t)})
    html=templateObj.render(contextObj)

    return HttpResponse(html)

editbook.html


# 金瓶眉所有作者的名字

book_obj=Book.objects.filter(title="金瓶眉").first()
authors=book_obj.authorlish.all()

for author_obj in authors:
    print(author_obj.name)

四、模版之标签

 

5、使用simple_tag和filter(如何调用)

从涉嫌对象集中移除执行的模子对象

1、在settings中的INSTALLED_APPS配置当前app,不然django不可能找到自定义的simple_tag.

 

<!--i=100-->
<p>{{ i|multi:2 }}</p>
<p>{% multiTag i 5 2 %}</p>

<!-- 自定义标签不能用到 if 和 for 标签中 -->
{% if i|multi:5 > 1000 %}
    <p>大于</p>
{% else %}
    <p>小于或等于</p>
{% endif %}

图片 5图片 6

1、语法:

# 查询id=1的书籍的出版社所在的城市
book_obj=Book.objects.get(id=1)
print(book_obj.publish.city) 
# book_obj.publish 是id=1的书籍对象关联的出版社对象

三、HTML被直接硬编码在
Python代码中的缺点

2)分组:annotate() 

locals()能够取代传参,可是必须在html里的模版变量和view里的变量名壹致,耗财富,不引入。

3)练习

二、深度查询: 通过句点符号 .

1)语法

可是1些时候我们大概不期望这个HTML成分被转义,大家能够通过过滤器“|safe”的不二秘籍告知Django那段代码是高枕无忧的不要转义。比如:

Book.objects.aggregate(average_price=Avg('price'))

2、for 标签  遍历

尽管修改相比不难就一句update消除,但是因为今日图书表和作者表是多对多连接所以在更新书籍表时需求精通之前的连键和成立新的连天,语法在事先都有教学在代码中也都标志出来了。

看望那个标签在浏览器中检查的结果

图片 7图片 8

也正是说,HTML被一贯硬编码在
Python代码之中:

searchbook.html

{% block content %}
...
{% endblock content %}

Bootstrap使用:http://www.cnblogs.com/liluning/p/7643879.html

模块名是稳定的无法友好起名,因为django会自个儿在此模块找

2)create

一)django模板修改的视图函数

View
Code

2、还有你可能早已注意到大家有三个事例视图中回到文本的办法有个别特别。(上篇小说)

您只要在建表时从没添加主键,django会自动给我们的表添加三个主键id,是否很棒0.0

4、date 时间

模版使用:http://v3.bootcss.com/examples/dashboard/

除开格式和别的编制程序语言用法相同不做过多阐述。

def addbook(request) :
    # 添加图书页面点击提交
    if request.method == "POST" :
        # 提取添加数据
        title = request.POST.get("title")
        author = request.POST.getlist("author")
        publishDate = request.POST.get("publishDate")
        prince = request.POST.get("prince")
        publish = request.POST.get("publish")
        # 出版社object
        publish_obj = models.Publish.objects.filter(name=publish)[0]
        # 添加数据到数据库
        book_obj = models.Book.objects.create(title=title, publishDate=publishDate, prince=prince ,publish=publish_obj)
        # 多对多添加
        for i in author :
            obj = models.Author.objects.filter(name=i)[0]
            book_obj.authorlish.add(obj)
        return redirect("/index/")

    # 作者与出版社querySet
    authorList = models.Author.objects.all()
    publishList = models.Publish.objects.all()
    return render(request,"addbook.html",{"authorList":authorList,"publishList":publishList})

倘假诺自定义标签加@register.simple_tag装饰器

# 计算所有图书的平均价格
from django.db.models import Avg
Book.objects.all().aggregate(Avg('price'))
#{'price__avg': 34.35}

据此说笔者们起先的讲模版就是html代码+模版语法

陆、删除表记录

4、with 缓存

 


# 查询 人民出版社出版过的所有书籍

publish=Publish.objects.get(name="人民出版社")
book_list=publish.book_set.all()  # 与人民出版社关联的所有书籍对象集合
for book_obj in book_list:
    print(book_obj.title)

在巨型模版中,那么些格局帮你领悟的来看哪贰个  {% block %} 标签被关闭了。

1、1对多添加语法**


引入使用第二种艺术
第两种格局在您知道外键publish_id确切的值时能够利用

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

图片 9图片 10

for 标签包括三个可选的{% empty %} 从句,在付出的组是空的只怕没有被找到时实施

反向查询

请小心,子模版并不曾定义 sidebar block,所以系统应用了母版中的值。母版的 {% block %} 标签中的内容总是被视作备选内容(fallback)。

正向查询

上篇散文大家在最后写了二个在意,那是不得法的不二等秘书诀,大家所诠释掉的一行是维护机制,那样想马上失去了爱护,之所以介绍此办法是应为还未曾接触到模版标签,csrf_token正是用来缓解post请求的。(用于跨站请求伪造爱护)

View
Code

2)优化后的写法(推荐)


extends 标签是此处的要害。它告诉模版引擎,那些模版“继承”了另3个模板。当模版系统处理那些模版时,首先,它将一定母版——在此例中,就是“base.html”。

三)外键字段 ForeignKey 有3个 null=True
的装置(它同意外键接受空值 NULL),你能够赋给它空值 None 。

Django的模版中会对HTML标签和JS等语法标签实行自动转义,原因肯定,那样是为了安全。

http://python.usyiyi.cn/translate/django_182/ref/templates/builtins.html#ref-templates-builtins-tags

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>
#统计每一本书的作者个数
bookList=Book.objects.annotate(authorsNum=Count('authors'))
for book_obj in bookList:
    print(book_obj.title,book_obj.authorsNum)

若果大家的模板要求运用css文件也许js文件那么那几个文件放哪儿吗?

实例:

假若果自定义过滤器加@register.filter装饰器

二)对于外键字段,Django
会在字段名上添加"_id" 来成立数据库中的列名

from django.shortcuts import render,HttpResponse

def timeHandle(request):
    import datetime
    t=datetime.datetime.now()
    return render(request,"time.html",{"time":str(t)[:19]})

2、template模版的设计

{% extends "base.html" %}

{% block title %}My amazing blog{% endblock %}

{% block content %}
{% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}

询问有关API前边的小说已经写到
单表查询还有双下划线查询0.0

<body>
<h1>current time: {{ time }}</h1>
</body>

4、查询表记录

②)在base模版中设置越来越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你能够在超越5/10blocks中填充合理的暗许内容,然后,只定义你供给的这几个。多一点钩子总比少一点好。


假诺三个变量是false大概为空,使用给定的暗中同意值。例如:

图片 11图片 12

将值格式化为1个 “人类可读的” 文件尺寸
(例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

def index(request) :
    # 查看主页(图书)
    bookList = models.Book.objects.all()
    return render(request,"index.html",{"bookList":bookList})

template—>time.html:

<!DOCTYPE html>
<!-- saved from url=(0041)http://v3.bootcss.com/examples/dashboard/ -->
<html lang="zh-CN">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->
    <meta name="description" content="">
    <meta name="author" content="">
    <link rel="icon" href="http://v3.bootcss.com/favicon.ico">

    <title>图书管理系统</title>

    <!-- Bootstrap core CSS -->
    <link href="/static/Dashboard_files/bootstrap.min.css" rel="stylesheet">

    <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
    <link href="/static/Dashboard_files/ie10-viewport-bug-workaround.css" rel="stylesheet">

    <!-- Custom styles for this template -->
    <link href="/static/Dashboard_files/dashboard.css" rel="stylesheet">

    <!-- Just for debugging purposes. Don't actually copy these 2 lines! -->
    <!--[if lt IE 9]>
    <script src="../../assets/js/ie8-responsive-file-warning.js"></script><![endif]-->
    <script src="/static/Dashboard_files/ie-emulation-modes-warning.js"></script>

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!--[if lt IE 9]>
    <script src="https://cdn.bootcss.com/html5shiv/3.7.3/html5shiv.min.js"></script>
    <script src="https://cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
    <![endif]-->

    <style>
        /*左侧菜单*/
        .head {
            margin: 1px -20px;
            line-height: 40px;
            text-align: center;
        }
        /*添加按钮*/
        .search {
            padding-bottom: 15px;
        }
    </style>

</head>

<body>
<!--导航栏-->
<nav class="navbar navbar-inverse navbar-fixed-top">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="/index/">图书管理系统</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
            <ul class="nav navbar-nav navbar-right">
                <li><a href="/index/">登录</a></li>
                <li><a href="/index/">注册</a></li>
                <li><a href="/index/">帮助</a></li>
                <li><a href="/index/">关于</a></li>
            </ul>
        </div>
    </div>
</nav>

<!--左侧菜单 和 学生信息-->
<div class="container-fluid">
    <div class="row">
        <!--左侧菜单-->
        <div class="col-sm-3 col-md-2 sidebar">

            <div class="menu">
                <div class="head bg-primary">图书管理</div>
                <ul class="nav nav-sidebar">
                    <li class=""><a href="/index/">&gt;&gt;&gt;查看图书</a>
                    </li>
                    <li><a href="/addbook/">&gt;&gt;&gt;添加图书</a></li>
                </ul>
            </div>
            <div class="menu">
                <div class="head  bg-primary">作者管理</div>
                <ul class="nav nav-sidebar">
                    <li><a href="/author/">&gt;&gt;&gt;查看作者</a></li>
                    <li><a href="/addauthor/">&gt;&gt;&gt;添加作者</a></li>
                </ul>
            </div>
            <div class="menu">
                <div class="head  bg-primary">出版社管理</div>
                <ul class="nav nav-sidebar">
                    <li><a href="/publish/">&gt;&gt;&gt;查看出版社</a></li>
                    <li><a href="/addpublish/">&gt;&gt;&gt;添加出版社</a></li>
                </ul>
            </div>
        </div>
        <!--学生信息(表格)-->
        <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">

            <div class="panel panel-primary">
                <div class="panel-heading">{% block info %}图书信息{% endblock info%}</div>
                <div class="panel-body">
                    <!-- 搜索框-->
                    {% block search %}
                        <form class="form-inline" action="/searchbook/" method="post">
                        {% csrf_token %}
                            <div class="form-group search">
                                <input type="text" class="form-control" placeholder="书名" name="book">
                                <button class="btn btn-primary">搜索</button>
                            </div>
                        </form>
                    {% endblock search %}

                    <!--内容-->
                    <div class="table-responsive table-bordered">
                        <table class="table table-striped" id="student">
                        {% block content %}
                            <thead>
                            <div class="row">
                                {% block th %}
                                    <tr>
                                        <th>编号</th>
                                        <th>书名</th>
                                        <th>作者</th>
                                        <th>出版日期</th>
                                        <th>价格</th>
                                        <th>出版社</th>
                                        <th>操作</th>
                                    </tr>
                                {% endblock th %}
                            </div>
                            </thead>
                            <tbody>
                                {% block td %}
                                    {% for book_obj in bookList %}
                                        <tr>
                                            <td>{{ forloop.counter}}</td>
                                            <td>{{ book_obj.title }}</td>
                                            <td>
                                                {% for author in book_obj.authorlish.all %}
                                                    {{ author.name }}
                                                {% endfor %}
                                            </td>
                                            <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
                                            <td>{{ book_obj.prince }}</td>
                                            <td>{{ book_obj.publish.name }}</td>
                                            <td>
                                               <a href="/editbook/{{ book_obj.id }}"><button class="btn btn-info">编辑</button></a>
                                               <a href="/delbook/{{ book_obj.id }}"><button class="btn btn-danger">删除</button></a>
                                            </td>
                                        </tr>
                                    {% endfor %}
                                {% endblock td %}
                            </tbody>
                        {% endblock content %}
                        </table>
                    </div>
                </div>
            </div>

        </div>
    </div>
</div>

<!-- Bootstrap core JavaScript
================================================== -->
<!-- Placed at the end of the document so the pages load faster -->
<script src="/static/Dashboard_files/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="../../assets/js/vendor/jquery.min.js"><\/script>')</script>
<script src="/static/Dashboard_files/bootstrap.min.js"></script>
<!-- Just to make our placeholder images work. Don't actually copy the next line! -->
<script src="/static/Dashboard_files/holder.min.js"></script>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<script src="/static/Dashboard_files/ie10-viewport-bug-workaround.js"></script>

<script>
//    左侧菜单
    $(".head").on("click", function () {
        // 把自己 紧挨着的ul标签显示  removeClass("hide")
        $(this).next().slideToggle();
        // 兄弟标签 紧挨着的ul标签 隐藏  addClass("hide")
        $(this).parent().siblings().children("ul").slideUp();
    });

</script>
</body>
</html>

本篇导论:

急需运用什么函数都要通过import导入
例如常用函数:Avg,Sum,Count,马克斯,Min

顾前不顾后

二、多对多添加语法

{{ value|slice:"2:-1" }} 

连带小说推荐:

<form action="/login/" method="post">
    {% csrf_token %}
    <p><input type="text" name="user"></p>
    <input type="submit">
</form>

2)template——index.html

{{ value|filesizeformat }}

图片 13

那边是运用持续的1部分提示:

把内定的模子对象添加到关联对象集中。

7、safe 安全机制

本篇继续以图书管理的例证。

**3、**始建任意 .py
文件,如:my_tags.py**

四)在表与表的再而三中有related_name属性可以起名用于反向查询,当然不写有私下认可(表名_set),一对一关联能够直接用表名 

 

一、建表

1、语法

from django.shortcuts import render,redirect,HttpResponse

# Create your views here.

from app01 import models

# 图书相关操作
def index(request) :
    # 查看主页(图书)
    bookList = models.Book.objects.all()
    return render(request,"index.html",{"bookList":bookList})

def delbook(request,id) :
    # 删除图书
    models.Book.objects.filter(id=id).delete()
    return redirect("/index/")

def editbook(request,id) :
    # 点击保存POST提交
    if request.method == "POST" :
        # 提取数据
        id = request.POST.get("id")
        title = request.POST.get("title")
        author_name = request.POST.getlist("author")
        publishDate = request.POST.get("publishDate")
        prince = request.POST.get("prince")
        publish_name = request.POST.get("publish")
        # 出版社object
        publish_obj = models.Publish.objects.get(name=publish_name)
        # 移除旧关联
        book_obj = models.Book.objects.filter(id=id)[0]
        book_obj.authorlish.clear()
        # 更新图书表
        models.Book.objects.filter(id=id).update(title=title, publishDate=publishDate, prince=prince,publish_id=publish_obj)
        book_obj = models.Book.objects.filter(id=id)[0]
        # 添加新关联
        for i in author_name :
            print(i)
            obj = models.Author.objects.filter(name=i)[0]
            book_obj.authorlish.add(obj)
        return redirect("/index/")

    # 图书、作者、出版社querySet
    bookList = models.Book.objects.all()
    authorList = models.Author.objects.all()
    publishList = models.Publish.objects.all()
    # 查看原作者
    author_name = models.Book.objects.filter(id=id).first().authorlish.all().values_list("name")
    edit_author = []
    for i in author_name :
        edit_author.append(i[0])
    return render(request,"editbook.html",{"bookList":bookList,"authorList":authorList,"publishList":publishList,"edit_author":edit_author,"id":int(id)})

def addbook(request) :
    # 添加图书页面点击提交
    if request.method == "POST" :
        # 提取添加数据
        title = request.POST.get("title")
        author = request.POST.getlist("author")
        publishDate = request.POST.get("publishDate")
        prince = request.POST.get("prince")
        publish = request.POST.get("publish")
        # 出版社object
        publish_obj = models.Publish.objects.filter(name=publish)[0]
        # 添加数据到数据库
        book_obj = models.Book.objects.create(title=title, publishDate=publishDate, prince=prince ,publish=publish_obj)
        # 多对多添加
        for i in author :
            obj = models.Author.objects.filter(name=i)[0]
            book_obj.authorlish.add(obj)
        return redirect("/index/")

    # 作者与出版社querySet
    authorList = models.Author.objects.all()
    publishList = models.Publish.objects.all()
    return render(request,"addbook.html",{"authorList":authorList,"publishList":publishList})

def searchbook(request) :
    if request.method == "POST" :
        book = request.POST.get("book")
        print(book)
        booklist = models.Book.objects.filter(title__icontains = book)
        return render(request,"searchbook.html",{"booklist":booklist})

壹)对页面设计开始展览的任何改动都不可能不对 Python
代码进行相应的修改。 站点设计的修改往往比底层 Python
代码的改动要频仍得多,因而只要能够在不进行 Python
代码修改的情事下转移规划,那将会有利于得多。

addbook.html

def index(request):
    name="yuan"
    return render(request,"index.html",{"n":name})
b = Blog.objects.get(id=1)
b.entry_set.clear()
{{obj|filter_name:param}}

二)建表实例

{% endblock %}结束标志

 

{% load my_tag %}
b = Blog.objects.get(id=1)
e = Entry.objects.get(id=234)
b.entry_set.remove(e)

二、改setting配置文件

{% extends "index.html" %}

{% block info %}
添加图书
{% endblock info %}

{% block search %}
<div class="row my-table-tool search">
    <div class="col-md-12">
        <a href="/index/"><button class="btn btn-primary">返回</button></a>
    </div>
</div>
{% endblock search %}

{% block th %}
    <tr>
        <th>书名</th>
        <th>作者</th>
        <th>出版日期</th>
        <th>价格</th>
        <th>出版社</th>
        <th>操作</th>
    </tr>
{% endblock th %}

{% block td %}
    <form action="/addbook/" method="post">
    {% csrf_token %}
        <tr>
            <td><input type="text" name="title"></td>
            <td>
                <select name="author" id="" multiple>
                    {% for author in authorList %}
                        <option value="{{ author.name }}">{{ author.name }}</option>
                    {% endfor %}
                </select>
            </td>
            <td><input type="date" name="publishDate"></td>
            <td><input type="text" name="prince"></td>
            <td>
                <select name="publish" id="">
                    {% for publish in publishList %}
                        <option value="{{ publish.name }}">{{ publish.name }}</option>
                    {% endfor %}
                </select>
            </td>
            <td>
                <button class="btn btn-info">提交</button>
            </td>
        </tr>
    </form>
{% endblock td %}
{% tag %}

4)搜索框搜索图书

三)程序员编写
Python代码和统一筹划职员营造模板两项工作同时实行的频率是最高的,远胜于让一人等待另一位完毕对有个别既包罗Python又饱含 HTML 的公文的编纂工作。

3**、①对多添加和多对多添加实例**

参数:要截断的字符数或单词数

图片 14

value="<a href="">点击</a>"

{{ value|safe}}

前方几篇随笔的数据库增加和删除改查操作都是在单表的操作上的,可是现实中不恐怕都以单表操作,更加多的是多表操作,一对一,一对多,多对多的表结构才是我们平日索要处理的,本篇将带大家询问多表操作的壹对连锁操作。也会带着大家做3个粗略的书籍管理的小演练。

一、新建文件夹static


2、default 设置默认

叁、添加表记录

 

{% extends "index.html" %}

{% block td %}
    {% for edit_obj in bookList %}
        {% if edit_obj.id == id %}
            <form action="/editbook/{{ edit_obj.id }}" method="post">
            {% csrf_token %}
                <tr>
                    <td>{{ forloop.counter}}<input type="hidden" name="id" value="{{ edit_obj.id }}"></td>
                    <td><input type="text" name="title" value="{{ edit_obj.title }}"></td>
                    <td>
                        <select name="author" id="" multiple>
                            {% for author in authorList %}
                                {% if author.name in edit_author %}
                                    <option selected value="{{ author.name }}">{{ author.name }}</option>
                                {% else %}
                                    <option  value="{{ author.name }}">{{ author.name }}</option>
                                {% endif %}
                            {% endfor %}
                        </select>
                    </td>
                    <td><input type="date" name="publishDate" value="{{ edit_obj.publishDate|date:"Y-m-d" }}"></td>
                    <td><input type="text" name="prince" value="{{ edit_obj.prince }}"></td>
                    <td>
                        <select name="publish" id="">
                            {% for publish in publishList %}
                                {% if publish.name == edit_obj.publish.name %}
                                    <option selected value="{{ publish.name }}">{{ publish.name }}</option>
                                {% else %}
                                    <option  value="{{ publish.name }}">{{ publish.name }}</option>
                                {% endif %}
                            {% endfor %}
                        </select>
                    </td>
                    <td>
                        <a href="/delbook/{{ edit_obj.id }}"><input type="button" class="btn btn-danger" value="删除"></a>
                        <button class="btn btn-success">保存</button>
                    </td>
                </tr>
            </form>
        {% else %}
            <tr>
                <td>{{ forloop.counter}}</td>
                <td>{{ edit_obj.title }}</td>
                <td>
                    {% for author in edit_obj.authorlish.all %}
                        {{ author.name }}
                    {% endfor %}
                </td>
                <td>{{ edit_obj.publishDate|date:"Y-m-d" }}</td>
                <td>{{ edit_obj.prince }}</td>
                <td>{{ edit_obj.publish.name }}</td>
                <td>
                   <a href="/editbook/{{ edit_obj.id }}"><button class="btn btn-info">编辑</button></a>
                   <a href="/delbook/{{ edit_obj.id }}"><button class="btn btn-danger">删除</button></a>
                </td>
            </tr>
        {% endif %}
    {% endfor %}
{% endblock td %}

6、模版继承

二)添加图书

示例:

图片 15图片 16

4、咱们来探视上边那段代码的任何达成格局

1、model 建表

 

Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))

8、越多过滤器

View
Code

3、if 标签 分支

2)提前在mysql数据Curry创制2个库

{{ value|length }}

伍、修改表记录

 

1)views

{% for person in person_list %}
    <p>{{ person.name }}</p>
{% endfor %}    <!--必须有的结束符-->

{% for k,v in d.items %}
     <p>{{ k }},{{ v }}</p>
{% endfor %}


{% for person in personList reversed %}
     <p>{{ forloop.counter }}---{{ person.name }},{{ person.age }}</p>
{% endfor %}
# 练习1:  查询人民出版社出版过的所有书籍的名字与价格(一对多)
    # 正向查询 按字段:publish
    queryResult=Book.objects.filter(publish__name="人民出版社").values_list("title","price")

    # 反向查询 按表名:book
    queryResult=Publish.objects.filter(name="人民出版社").values_list("book__title","book__price")

# 练习2: 查询egon出过的所有书籍的名字(多对多)
    # 正向查询 按字段:authors:
    queryResult=Book.objects.filter(authors__name="yuan").values_list("title")

    # 反向查询 按表名:book
    queryResult=Author.objects.filter(name="egon").values_list("book__title","book__price")


# 练习3: 查询人民出版社出版过的所有书籍的名字以及作者的姓名
    # 正向查询
    queryResult=Book.objects.filter(publish__name="人民出版社").values_list("title","authors__name")
    # 反向查询
    queryResult=Publish.objects.filter(name="人民出版社").values_list("book__title","book__authors__age","book__authors__name")


# 练习4: 手机号以151开头的作者出版过的所有书籍名称以及出版社名称
queryResult=Book.objects.filter(authors__authorDetail__telephone__regex="151").values_list("title","publish__name")
{{ value|default:"查询为空" }}

3、注意

STATIC_URL = '/static/'    相当于别名
STATICFILES_DIRS=[
    os.path.join(BASE_DIR,"static"),
]

字典的key默认(字段名__函数名)也得以本人起名字average_price

四)假设实模版不想平素覆盖母板内容只想做追加,那么在须要扩大的内容前拉长标签 {{ block.super }}这个标签就代表这母板{% block %}里的备选内容

图片 17图片 18

5、自定义标签和过滤器

图片 19图片 20

 

三)修改图书音讯

def index(request):
    name="hello template"
    i=200
    l=[111,[333,444,555],333]
    d={"name":"yuan","age":23}
    class Person(object):
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def dream(self):
            return "I am dreaming"
    person_bjd=Person("bjd",20)

    #return render(request,"index.html",{"name":name,"i":i,"l":l,"d":d,"person_egon":person_bjd})
    return render(request,"index.html",locals())

二)多对多询问

4、filesizeformat 文件大小

{% extends "index.html" %}

{% block info %}
{{ booklist.first.title }}
{% endblock info %}

{% block search %}
<form class="form-inline" action="/searchbook/" method="post">
{% csrf_token %}
    <div class="form-group search">
        <input type="text" class="form-control" placeholder="书名" name="book">
        <button class="btn btn-primary">搜索</button>
        <a href="/index/"><button class="btn btn-primary">返回</button></a>
    </div>
{#    <div class="row my-table-tool search">#}
{#        <div class="col-md-12">#}
{#            #}
{#        </div>#}
{#    </div>#}
</form>
{% endblock search %}

{% block th %}
    <tr>
        <th>编号</th>
        <th>书名</th>
        <th>作者</th>
        <th>出版日期</th>
        <th>价格</th>
        <th>出版社</th>
        <th>操作</th>
    </tr>
{% endblock th %}

{% block td %}
    {% for book_obj in booklist %}
    <tr>
        <td>{{ forloop.counter}}</td>
        <td>{{ book_obj.title }}</td>
        <td>
            {% for author in book_obj.authorlish.all %}
                {{ author.name }}
            {% endfor %}
        </td>
        <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
        <td>{{ book_obj.prince }}</td>
        <td>{{ book_obj.publish.name }}</td>
        <td>
           <a href="/editbook/{{ book_obj.id }}"><button class="btn btn-info">编辑</button></a>
           <a href="/delbook/{{ book_obj.id }}"><button class="btn btn-danger">删除</button></a>
        </td>
    </tr>
    {% endfor %}
{% endblock td %}

如果 value 是
12345678九,输出将会是 117.7 MB

图片 21图片 22

1、语法:

四、相关办法言传身教(例子选自官网)

一)假诺您在模板中动用 {% extends %} 标签,它必须是模版中的第一个标签。其余的别的意况下,模版继承都将不可能工作。

二、基于对象的跨表查询


一、双下划线单表查询

最终,请留心你并不能够在三个模板中定义七个相同名字的 block 标签。那些范围的留存是因为block标签的功力是“双向”的。这几个意思是,block标签不仅提供了一个坑去填,它还在
_父模版_中定义了填坑的内容。假若在八个模板中有多个名字一样的 block 标签,模版的父模版将不知底使用哪个block的剧情。

图片 23

 

此次的小演练template是用Bootstrap框架搭建的,因为大家本篇主讲的django模版层所以会贴出代码逮捕做分析,对前者有题指标能够看以前相关小说哦。

6、truncatechars与**truncatewords 截断**

方式1:
   publish_obj=Publish.objects.get(nid=1)
   Book.objects.create(title="金瓶眉",publishDate="2012-12-12",publish=publish_obj)

方式2:
   Book.objects.create(title="金瓶眉",publishDate="2012-12-12",publish_id=1)
from django.http import HttpResponse
import datetime

def current_datetime(request):
    now = datetime.datetime.now()
    html = "<html><body>It is now %s.</body></html>" % now
    return HttpResponse(html)

四、基于双下划线的跨表查询

二、在app中开创templatetags模块(模块名只可以是templatetags)

b = Blog.objects.get(id=1)
e = b.entry_set.create(
    headline='Hello',
    body_text='Hi',
    pub_date=datetime.date(2005, 1, 1)
)

选取多少个简单易行地名字缓存1个复杂的变量,当您供给利用二个错综复杂的变量很频仍的时候是相当有效的

book_obj=Book.objects.create(title="追风筝的人",publishDate="2012-11-12",prince=69,publish_id=1)

author_yuan=Author.objects.create(name="yuan",age=23...)
author_egon=Author.objects.create(name="egon",age=32...)

book_obj.authorlish.add(author_egon,author_yuan)    #  将某个特定的 model 对象添加到被关联对象集合中。   =======    book_obj.authors.add(*[])

book_obj.authorlish.create()      #创建并保存一个新对象,然后将这个对象加被关联对象的集合中,然后返回这个新对象。

3、示例:

 

4、在选拔自定义simple_tag和filter的html文件中程导弹入此前创设的
my_tags.py

一)1对多询问

上篇首要介绍了django的MTV模型,首要介绍了视图层之路由布置种类url分发和视图层之视图函数view,本篇首要助教MTV模型中的模版层template。

from django.conf.urls import url
from django.contrib import admin

from app01 import views
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^index/', views.index),
    url(r'^delbook/(\d+)', views.delbook),
    url(r'^editbook/(\d+)', views.editbook),
    url(r'^addbook/', views.addbook),
    url(r'^searchbook/', views.searchbook),

    url(r'^author/', views.author),
    url(r'^addauthor/', views.addauthor),
    url(r'^delauthor/(\d+)', views.delauthor),
    url(r'^editauthor/(\d+)', views.editauthor),

    url(r'^publish/', views.publish),
    url(r'^addpublish/', views.addpublish),
    url(r'^delpublish/(\d+)', views.delpublish),
    url(r'^editpublish/(\d+)', views.editpublish),
]

# 查询egon出过的所有书籍的名字
author_obj=Author.objects.get(name="egon")
book_list=author_obj.book_set.all() #与egon作者相关的所有书籍

for book_obj in book_list:
    print(book_obj.title)
<link rel="stylesheet" href="/static/bootstrap-3.3.7/css/bootstrap.min.css">

伍、部分职能图

基于那一个原因,将页面的宏图和Python的代码分离开会更干净简单更便于有限帮助。
我们能够动用 Django的 模板系统 (Template
System)来落到实处那种方式,这就是本章要切实可行研讨的标题。

2、建表

图片 24

def editbook(request,id) :
    # 点击保存POST提交
    if request.method == "POST" :
        # 提取数据
        id = request.POST.get("id")
        title = request.POST.get("title")
        author_name = request.POST.getlist("author")
        publishDate = request.POST.get("publishDate")
        prince = request.POST.get("prince")
        publish_name = request.POST.get("publish")
        # 出版社object
        publish_obj = models.Publish.objects.get(name=publish_name)
        # 移除旧关联
        book_obj = models.Book.objects.filter(id=id)[0]
        book_obj.authorlish.clear()


        # 更新图书表
        models.Book.objects.filter(id=id).update(title=title, publishDate=publishDate, prince=prince,publish_id=publish_obj)


        book_obj = models.Book.objects.filter(id=id)[0]
        # 添加新关联
        for i in author_name :
            print(i)
            obj = models.Author.objects.filter(name=i)[0]
            book_obj.authorlish.add(obj)
        return redirect("/index/")

叁、模版之过滤器

2、template 模版

模版包罗在使用时会被值替换掉的 变量,和决定模版逻辑的 标签。

演习肆须求在本建表实例上添加三个authorDetail笔者详细音信表将电话号等详细新闻放进去与小编表建立一对壹关系

<p>{{ name }}</p>
<p>{{ i }}</p>
<p>{{ l.1 }}</p>
<p>{{ d.name }}</p>
<p>{{ person_egon.name }}</p>
<p>{{ person_egon.age }}</p>
<p>{{ person_egon.dream }}</p>

5、聚合查询与分组查询

此文件名叫自定义

图片 25图片 26

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title>My amazing blog</title>
</head>

<body>
    <div id="sidebar">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    </div>

    <div id="content">
        <h2>Entry one</h2>
        <p>This is my first entry.</p>

        <h2>Entry two</h2>
        <p>This is my second entry.</p>
    </div>
</body>
</html>

一、准备工作

那种方式使代码获得最大程度的复用,并且使得添加内容到共享的内容区域越发简明,例如,部分范围内的导航。


老是大家创造叁个新类型的时候路径下都会自带叁个templates,没有错这些文件夹正是用来放大家的html代码的。

1)首页

 一般暗中认可已经配备好了借使未有配备本身加上

#图书表
class Book(models.Model) :
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    prince = models.DecimalField(max_digits=5,decimal_places=2)

    publish = models.ForeignKey("Publish")  #一对多

    authorlish = models.ManyToManyField("Author")   #多对多

    def __str__(self) :
        return self.title

#出版社
class Publish(models.Model) :
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

    def __str__(self) :
        return  self.name

#作者表
class Author(models.Model) :
    name = models.CharField(max_length=32)
    sex = models.CharField(max_length=32)
    age = models.IntegerField()
    tel = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

    def __str__(self) :
        return  self.name

2)Python 代码编写和 HTML
设计是两项分化的劳作,大部分正规的网址开发条件都将她们分配给区别的人口(甚至差别单位)来完毕。
设计者和HTML/CSS的编码人士不应该被要求去编辑Python的代码来形成他们的行事。

本篇导航:

依据钦点的字符或单词数量截断。截断的字符串将以可翻译的省略号系列(“…”)结尾。

4)clear

5、slice 切分

1)聚合:aggregate()

5)为了更加好的可读性,你也能够给你的 {% endblock %} 标签3个 名字 。例如:

 

{{ value|truncatechars:20 }}    <!--按字符截断-->
{{ value|truncatewords:5 }}    <!--按单词截断-->

3、url 分发

六、相比过滤器与自定义标签的施用:
过滤器函数的参数只可以有多个,自定义标签无参数限制

静态文件在模板中的使用:http://www.cnblogs.com/liluning/p/7724699.html

 

View
Code

{{ var }}

1回也询问几个能够

过滤器能够与逻辑标签共同利用,比如if标签。自定义标签不得以。

从涉嫌对象集中移除一切对象。

forloop.counter    从1开始计数
forloop.counter0    从0开始基数
forloop.revcounter    倒序到1结束
forloop.revcounter0    倒序到0结束
forloop.first    是一个布尔值,如果该迭代是第一次执行,那么它被置为True
forloop.last    是一个布尔值,如果该迭代是最后一次执行,那么它被置为True

Bootstrap官网:http://v3.bootcss.com/

3、使用

图片 27

能够将大家必要的一部分切分出来

View
Code

5、csrf_token

正向查询

7、静态文件配置(扩张内容
通晓即可)


Django模版引擎中最强劲也是最复杂的1对正是模版继承了。模版继承能够让您创立两个大旨的“骨架”模版,它涵盖您站点中的全体成分,并且能够定义能够被子模版覆盖的 blocks 。

from django.db import models

# Create your models here.

#图书表
class Book(models.Model) :
    title = models.CharField(max_length=32)
    publishDate = models.DateField()
    prince = models.DecimalField(max_digits=5,decimal_places=2)

    publish = models.ForeignKey("Publish")  #一对多

    authorlish = models.ManyToManyField("Author")   #多对多

    def __str__(self) :
        return self.title

#出版社
class Publish(models.Model) :
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

    def __str__(self) :
        return  self.name

#作者表
class Author(models.Model) :
    name = models.CharField(max_length=32)
    sex = models.CharField(max_length=32)
    age = models.IntegerField()
    tel = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

    def __str__(self) :
        return  self.name
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app1.apps.App1Config',    #默认已有 如果没有只要添加app名称即可 例如: 'app1'
]

当然大家绑定的关联也能够排除:

图片 28

3)remove

3、lenght 长度

7、图书管理小练习(只贴上书籍的增加和删除改查代码)

2、模版之变量

反向查询

from django import template
from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改变

@register.filter
def multi(x,y):
    return x*y

@register.simple_tag
def multiTag(x,y,z):
    return x*y*z

以此图书的小练习中的表未有一对一关联用法用任何四个关系基本相同

{% if num > 100 or num < 0 %}
    <p>无效</p>
{% elif num > 80 and num < 100 %}
    <p>优秀</p>
{% else %}
    <p>凑活吧</p>
{% endif %}

View
Code

2)template

图片 29图片 30

它是隐身的,value值也等于带着一个服务器给它的身份证,未有身份证的post请求会被驳回,value值是开拓登录页面是get请求的时候回来的。

# 统计每一个出版社的最便宜的书
queryResult=Book.objects.values("publish__name").annotate(MinPrice=Min('price'))

# 统计每一本以py开头的书籍的作者个数
queryResult=Book.objects .filter(title__startswith="Py").annotate(num_authors=Count('authors'))

# 统计不止一个作者的图书
queryResult=Book.objects.annotate(num_authors=Count('authors')).filter(num_authors__gt=1)

# 根据一本图书作者数量的多少对查询集 QuerySet进行排序
Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')

# 查询各个作者出的书的总价格
# 按author表的所有字段 group by
    queryResult=Author.objects.annotate(SumPrice=Sum("book__price")).values_list("name","SumPrice")

#按authors__name group by
 queryResult2=Book.objects.values("authors__name").annotate(SumPrice=Sum("price")).values_list("authors__name","SumPrice")

循环序号能够通过{{forloop}}展现::

四、views 视图函数

模型:书籍有书名、小编、出版日期、价格,出版社,一本书只怕会有多少个小编,一个小编也得以写多本书,所以我和图书的关系就是多对多的涉嫌关系(many-to-many);一本书只应该由一个出版商出版,所以出版商和书籍是一对多关系关系(one-to-many)。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图