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


    1.循环往复输出

  继续上边的例证。试题光不经常和分数还不够,笔者想要出一道采纳题,能够团结丰硕若干增选并编写选项内容,代码该怎么写啊?先上代码:

  HTML部分:

图片 1

图片 2

<div ng-controller="testC">
    <h1>{{question.newtitle}}</h1>
    题目:<input type="text" ng-model="question.name" /><br />
    分数:<input type="text" number ng-model="question.fraction" /><br />
    选项:<button ng-click="addOption()">增加选项</button><br />
    <ul>
        <li ng-repeat="o in question.options">
            <b>{{$index+1}}.</b>
            <input type="text" ng-model="o.content" value="o.content" />
            <a href="javascript:void(0);" ng-click="delOption($index)">删除</a>
        </li>
    </ul>
    <hr>
    <div >
        <h1>{{question.previewtitle}}</h1>
        <b>{{question.name}}</b>({{question.fraction}}分)
        <ul>
            <li ng-repeat="o in question.options">
                <b>{{$index+1}}.</b>
                <input type="radio" name="optcheck" />
                {{o.content}}
            </li>
        </ul>
    </div>
</div>

图片 3

图片 4

  js部分:

图片 5

图片 6

var app = angular.module('MyApp', [], function(){console.log('started')});
var questionModel = {
    newtitle : '新建试题',
    previewtitle : '预览试题',
    name : '',
    fraction : '',
    options : []
};
app.controller('testC',function($scope){
    $scope.question = questionModel;
    $scope.addOption = function(){
        var o = {content:''};
        $scope.question.options.push(o);
    };
    $scope.delOption = function(index){
        $scope.question.options.splice(index,1);
    };
});

图片 7

图片 8

  请留心本人的js代码有了几许变通,在数据绑定时没有直接写成字符串,而是将持有的数码写成了二个questionModel对象,那只是三个常见的js对象,那样能够使大家的多少看起来像是“model”的金科玉律,毕竟大家是MV*嘛。那么在模板中,我们采纳name的地点也改成question.name,别的的值也同理。其余在controller部分,笔者从不用var
textC =
function(){}那样的写法,而是改成了app.controller(‘textC’,function(){}),那样显明内定了这么些controller属于MyApp那些模块,大家的MV*代码看起来更标准、更紧密了。

  在HTML部分本身分别在瑞昌市域和预览区域添加了一个列表,用来放置各选项。并添加了2个“扩张选项”按钮。在<li>标签上选择了ng-repeat指令来拓展巡回输出,<li>标签将会依照$scopt中的options数总裁度被复制多份。在循环范围内,能够动用$index获妥帖前循环的目录,能够认为这是一个公家变量,间接行使。同时,循环输出的各样<input>成分也采用ng-model与选用的内容进行了双向绑定。其它还输出3个删减链接,点击的时候调用$scope中的delOption方法。

  那样绑定好未来,模版中的列表与数据模型中的options数组便保持了一道,我们在页面上点击扩大选项,数组中便会扩大七个成分,数组中的每一个元素也会实时举报在模板中。所以在js代码中,大家只须操作options数组就够了,压根不须要在页面上append或removed节点。

  你能够在下面点击增添选项和删除试试~

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

③ 、起初运营angular

  有了贰个差不多的朦胧的打听就够了,小编相信广大概念在行使的经过中会稳步清晰。作者火速的想要让angular运转起来了。入手~

  首先从官网http://angularjs.org/下载angular.js,引入你的页面中,然后大家运用最简便的手工业运转格局,直接调用bootstrap方法。全数的代码如下:

图片 9

图片 10

<!DOCTYPE html>
<html >
<head>
<meta charset="utf-8" />  
<title>运行ng</title>
<script type="text/javascript" src="../angular.js"></script>
</head>
<body>
<div>
    1+1={{1+1}}
</div>   
<script>
angular.bootstrap(document,[]);
</script>
</body>
</html>

图片 11

图片 12

  唯有一行代码。调用bootstrap方法传入功效域和初阶化的模块数组(此处为空)。是或不是很容易。你飞速会晤到一处比较尤其的,就是此处:

<div>
    1+1={{1+1}}
</div>

  假诺你使用过别的模板库,应该对那种写法不生疏了,{{}}双大括号,这是ng的模版中用于书写表明式的记号,ng成功运营起来后,{{}}内的表明式会收效,即页面会展现如下:

 图片 13

  为了不让你把ng看的如此不难,笔者无法不告诉您相似是不这么运维的,来看有点修改今后的代码:

图片 14

图片 15

<!DOCTYPE html>
<html ng-app="MyApp">
<head>
<meta charset="utf-8" />  
<title>运行ng</title>
<script type="text/javascript" src="../angular.js"></script>
</head>
<body>
<div>
    1+1={{1+1}}
</div>

<script type="text/javascript" charset="utf-8">
var app = angular.module('MyApp', [], function(){console.log('started')});
</script>
</body>
</html>

图片 16

图片 17

  在<html>标签上多了贰性格能ng-app=”MyApp”,它的职能就是用来钦赐ng的功效域是在<html>标签以内部分。在js中,大家调用angular对象的module方法来声称一个模块,模块的名字和ng-app的值对应。关于怎么着评释、使用模块大家在前边会讲。未来大家只要精通用那种办法得以优雅的让ng运行起来就能够了。

把钦命的模子对象添加到关联对象集中。

五 、模板中的一些决定方法

  大家在运用别的模板库时,一般都会有模板的轮回输出、分支输出、逻辑判断等接近的操纵。ng模板中都可以展开哪些控制呢?来一块探索之。

图片 18图片 19

⑧ 、总计一下

   
乎~能够松一口气了。文章写到那里总算接近尾声了,不知自个儿上边的陈述能还是不可能被我们知晓。ng所涵盖的内容还是挺多的,以上的各类概念都得以再拆出几篇小说来上课。所以小编在此间只好是每1个都点到停止,不揪细节。那篇文章的沉思也便是“先精晓概念,例子能跑起来就行了”。在随后的稿子中会随着小编就学的深入进行探索。

转载


柒 、注重注入

  通过注重注入,ng想要推崇一种申明式的开发格局,即当大家要求选择某一模块或劳动时,不需求关心此模块内部怎么样贯彻,只需声美赞臣下就足以采用了。在多处采纳只需进行多次声称,大大进步可复用性。

  比如大家的controller,在概念的时候用到叁个$scope参数。

app.controller('testC',function($scope){});

  如若大家在这边还需操作其余的事物,比如与浏览器地址栏实行相互。大家只需再多添1个参数$location进去:

app.controller('testC',function($scope,$location){});

  那样便得以通过$location来与地址栏举办互动了,我们仅仅是宣称了弹指间,所需的其余代码,框架已经帮大家注入了。大家很醒目标感觉到到了这一个函数已经不是正常意义上的javascript函数了,在寻常的函数中,把形参换几个名字依旧能够运作,但在此地假诺把$scope换来别的名字,程序便无法运营了。因为那是曾经定义好的服务名称。

  那便是借助注入机制。顺理成章的估测计算,我们得以自个儿定义模块和服务,然后在须要的地点进行宣示,由框架来替我们注入。

  对,作者的小例子呢?笔者现在要想点供给来把正视注入试验须臾间。小编觉着考题全是文字太枯燥了,我期望题材中能含有图片/音录像,可能选拔中得以分包图片/音录制。并且,笔者要更灵活一点,笔者要为试题提供多少套模板来挑选,选用不相同的模板能够新建分歧样式的题,比如模板一为纯文字试题、模板二为题材中带图片/音录制的试题、模板三为选拔中带图片/音摄像的考题,等等。注意此处所说的沙盘跟ng的沙盘不是二个概念,是自家本身课题的模板,不要混淆。那个模板应该是与试题相分离的,以往能够为任何题型例如填空题啊简答题啊同样利用。所以试题模板这一个东西就需求做成服务了。

  不亮堂本身表明清楚了从未,确实有点绕。来看下大家怎么着定义贰个劳务:

app.factory('tpls',function(){
    return ['tpl1','tpl2','tpl3','tpl4'];
});

  看上去杰出不难,是因为本人在此地唯有是一向回到贰个数组。在实际上利用中,那里应该是急需向服务器发起2个请求,来获得到那几个模板们。服务的定义形式有少数种,包括利用provider方法、使用factory方法,使用service方法。它们中间的分别权且不关切。大家明天若是能创立一个服务出来就足以了。作者动用了factory方法。二个亟需留意的地点是,框架提供的劳动名字都是由$起始的,所以大家和好定义的Infiniti不要用$开始,幸免发生命名争辨。

  定义好一个服务后,大家就足以在控制器中扬言使用了,如下:

图片 20

图片 21

app.controller('testC',function($scope,tpls){
    $scope.question = questionModel;
    $scope.nowTime = new Date().valueOf();
    $scope.templates = tpls; //赋值到$scope中
    $scope.addOption = function(){
        var o = {content:''};
        $scope.question.options.push(o);
    };
    $scope.delOption = function(index){
        $scope.question.options.splice(index,1);
    };
});

图片 22

图片 23

  此时,若在模板中书写如下代码,大家便得以得到到劳动tpls所提供的数量了:

模板:<a href="javascript:void(0);" ng-repeat="t in templates">{{t}}&nbsp;&nbsp;</a><br />

  随着知识点的一小点充实,作者的那几个小例子也越发从容了,来看看完整版啊:

 

  查看完整代码请移步到runjs:http://runjs.cn/code/95wlwsfh

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

 

<!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>

六、指令(directive)

  前面早已提到很频仍命令了,今后来规范介绍一下它。指令是ng为HTML补充的语法扩大,用于升高HTML的表现力。像我们事先使用的ng-controller、ng-model等都属于指令。你也能够自定义指令。ng内部含有了3个无敌的DOM解析引擎,所以这几个新的竹签或许标签属性能够像使用原生HTML那样很好的工作。

  听起来很牛的样子,那大家来试试看本身定义多少个发令吧。注意,小编要变形了~

  小编是老师,在新建试题输入分数的时候应该只可以输入数字才对,输入任何剧情是非法的,而且小编希望那么些分数是1~10里面包车型地铁数字。能不能够只在输入框上加三个属性就形成这么些证明呢?就好像使用HTML5新增的required一样。

  大家定义二个名为fractionNum的一声令下如下:

图片 24

图片 25

app.directive('fractionNum',function(){
    return {
        link : function(scope, elements, attrs, controller){
            elements[0].onkeyup = function(){
                if(isNaN(this.value) || this.value<1 || this.value>10){
                    this.style.borderColor = 'red';
                }
                else{
                    this.style.borderColor = '';
                }
            };
        }
    };
});

图片 26

图片 27

  哇,代码好多层级呀,不要恐慌,稳住阵脚!其实最后正是回来了富含link字段的对象,link的值是一个函数,用来定义指令的一举一动。从传出的参数中得以博得到当下因素,大家便可以拿当前成分开刀了。笔者在此处监听当前成分的keyup事件,获取成分的值,即使不是1~第10中学间的数字,则把输入框的边框颜色变为青蓝。那下那个命令就足以干活了。

  至于传入的多个参数到底都有怎么样玄机,小编暂时还未研究,也不是本篇的显要,本篇只是做3个一览,先把ng拉出来溜溜的趣味。将来姑且能够认为,三个发令的稳定写法大约正是其一组织。

  定义好的一声令下就足以在模板中使用了,使用方式如下:

分数:<input type="text" ng-model="question.fraction" fraction-num /><br />

  把它加在了分数输入框上,此处要专门小心贰个写法,小编定义的时候名字是fractionNum,用在模板中须要写成fraction-num,就是因为名字中包蕴大写字母的由来,感觉上跟使用css属性名称有点像。假设定义的时候从十分小写字母,就不要担心那一点了。

  看效率,今后您能够去下面施行强暴那个分数输入框去了~

2)建表实例

一、前言

  前端技术的前进是那样之快,各样优质技能、优良框架的出现几乎令人目不暇接,作为一名产业界新秀,紧跟时流,学习驾驭新知识自然是不敢怠慢。当听见AngularJs这么些名字并掌握是google在保卫安全它时,便径直在关切,看到其在外国已经丰富炎热,不过国内的采用情形却有十分大的差别,参考文献/网络小说也很缺少。一遍各处思量深切,决定深刻学习angular,并写类别博客,一方面作为团结上学路程上的记录,另一方面也给有趣味的同学一些参照。

  首先笔者自个儿是一名学习者,会以学习者的角度来收拾自身的著述思路,故该连串博客也不可能称为教程,只好是些探索,有明白或是技术上的错误还请我们提议。其次作者尤其喜爱编写小例子来把一件事情说清楚,故在文中会尽大概多的用示例加代码讲解,作者信任那会是一钟相比较好的不二法门。最终,我深知在存活规则下对于angular的学习会困难重重,可是作者更信任坚韧不拔的力量,所以谨以此文作为日后攻读的引力,让我们共同来走进angular的社会风气吧~


④ 、模板与数码的绑定

  首先必要领悟一下模板的概念。在自身还不知晓有模板那几个事物的时候,曾经用js拼接出不长的HTML字符串,然后append到页面中,那种方法考虑真是又土又笨。后来又见到能够把HTML代码包裹在2个<script>标签中作为模板,然后按须要取来使用。在ng中,模板13分简易,它正是大家页面上的HTML代码,不要求增大其他附加的东西。在模板中能够动用各类指令来抓实它的功力,那些指令能够让您把模版和多少巧妙的绑定起来。

  绑定那几个东西可是ng中的大功臣了。在大家运用jQuery的时候,代码中会大批量满载类似那样的讲话:var
v =
$(‘#id’).val();$(‘#id’).html(str);即频仍的DOM操作(读取和写入),其实大家的末段目标并不是要操作DOM,而是要促成工作逻辑。ng的绑定将让您摆脱DOM操作,只要模板与数码通过注明进行了绑定,两者将随时保持同步,最新的数码会实时展现在页面中,页面中用户修改的数额也会实时被记录在数据模型中。

  作者合计了1个小例子,本篇文章的示范将围绕这几个小例子来开始展览。笔者猜你曾经厌倦了登录模块或许是购物车示例,大家来点新颖的。笔者已化身为一名教师职员和工人,我要用七个web应用来为学生出一份在线试题。首先从一道题开头吧~

图片 28

图片 29

<!DOCTYPE html>
<html ng-app="MyApp">
<head>
<meta charset="utf-8" />  
<title>模板数据绑定</title>
<script type="text/javascript" src="../angular.js"></script>
</head>
<body>
<div ng-controller="testC">
    <h1>{{newtitle}}</h1>
    题目:<input type="text" ng-model="name" /><br />
    分数:<input type="text" ng-model="fraction" /><br />
    <hr>
    <h1>{{previewtitle}}</h1>
    <b>{{name}}</b>({{fraction}}分)
</div>
<script type="text/javascript" charset="utf-8">
var app = angular.module('MyApp', [], function(){console.log('started')});
var testC = function($scope){
    $scope.newtitle = '新建试题';
    $scope.previewtitle = '预览试题';
    $scope.name = $scope.fraction = '';
}
</script>
</body>
</html>

图片 30

图片 31

  页面上有分别代表标题和分数的多少个输入框,下边有2个实时预览区域,用来展示题指标尾声输出效果。ng-controller=”textC”用来声称3个需求和多少开展绑定的沙盘区域,它的成效域正是以此div之内的事物,并起名为textC,js代码中定义了二个名为textC的函数与它对应,大家将在这么些函数内成功绑定。函数字传送入1个参数$scope,表示这一个功用范围。我们分别为服从范围内的newtitle、previewtitle、name、fraction八个变量赋值。此时<h1>标签内的{{}}便能赢得相应的值了。

  通过{{}}只可以完结多少向模板的单向绑定。要想拓展双向绑定,大家要求使用ng-modle这一个命令,大家使用它分别为难题和分数进行了双向绑定,那样当输入框内的值产生变化时,函数中的变量也会尾随变化,它的变化会实时反映在下方的预览区域中,因为预览区域中也有三个name和fraction的绑定。

  试试在下面的输入框中实行编辑吧~

  大家从没开始展览别的DOM操作,框架自动实现了DOM的取值和赋值。在背后笔者将继承完善这一个事例,并引入越来越多的新定义。

 

  2.单个节点的主宰

  在上头的例证中,你是还是不是意识了,笔者在拍卖按钮的点击时,使用了号称ng-click的一声令下,为啥不直接用onclick呢?是因为ng遵照本人的内需展开了包装。大家把addOption那些函数定义在了controller范围之内,用大家健康的onclick已经不可能访问到。换言之,大家页面上的功效域,ng已经帮大家都设计好了,大家只需遵照它提供的措施来利用就够了。

  通过onclick大家得以联想到,HTML节点还有众多别的属性,如class、style、href、checked、disabled等等,ng对那几个都逐项举办了包装,更决定的是,除却ng还附加提供了很多尤为详实的决定节点的指令。这几个指令作者随后会详细钻探,在此间,大家先拿个里面2个用到到大家的例证中,看看效果先。

  笔者及时变回老师身份,哗~

  小编新建试题的时候,不要局限于单选题,小编想要在单选题和多选题之间能够切换,同时下方的预览区域内,采用框也拓展单选框和多选框的切换。上代码:

  HTML部分:

图片 32

图片 33

<div ng-controller="testC">
    <h1>{{question.newtitle}}</h1>
    题目:<input type="text" ng-model="question.name" /><br />
    分数:<input type="text" ng-model="question.fraction" /><br />
    类型:<select ng-model="question.type"><option value="1" selected>单选</option><option value="2">多选</option></select><br />
    选项:<button ng-click="addOption()">增加选项</button><br />
    <ul>
        <li ng-repeat="o in question.options">
            <b>{{$index+1}}.</b>
            <input type="text" ng-model="o.content" value="o.content" />
            <a href="javascript:void(0);" ng-click="delOption($index)">删除</a>
        </li>
    </ul>
    <hr>
    <div preview-panel>
        <h1>{{question.previewtitle}}</h1>
        <b>{{question.name}}</b>({{question.fraction}}分)
        <ul>
            <li ng-repeat="o in question.options">
                <b>{{$index+1}}.</b>
                <input type="radio" name="optcheck" ng-show="question.type==1" />
                <input type="checkbox" ng-show="question.type==2" />
                {{o.content}}
            </li>
        </ul>
    </div>
</div>

图片 34

图片 35

  Js代码中,小编只是在questionModel中新增了一项type:1,表示题的项目,1为单选,2为多选。并给默许值为1.

图片 36

图片 37

var questionModel = {
    newtitle : '新建试题',
    previewtitle : '预览试题',
    name : '',
    fraction : '',
    type : '1',
    options : []
};

图片 38

图片 39

  在HTML中,我新增了一个下拉框,并与question.type建立双向绑定。供给关切的是上面的预览区域。作者又添加了三个checkbox控件来为多选题提供选拔框。显明,radio与checkbox不能够而且存在,所以本人用ng-show那个命令来决定它们的显隐,ng-show接收boolean类型的值以及计算结果为boolean类型的表明式。请留心,ng-show以及别的具有指令的值不是回顾的字符串(尽管看起来是那样),而是字符串表明式,拥有计算能力,笔者后天的知晓是它以后会在框架的有些位置放进eval()或是类似的函数执行。{{}}里的剧情也是同一。

  所以在那里小编给radio的ng-show赋值为question.type==1,checkbox的ng-show赋值为question.type==2。当试题是单选题时,radio的ng-show便能获取值true,从而呈现出来。在下面看一下功效:

  别的的节点控制指令也得以接近那样使用,思想就是基于你的政工逻辑,赋予它们必然的表明式。其余的决定还有事件绑定、表单控件等等,篇幅的限定在此间就不讲了,未来特别开一篇介绍。

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

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

 

方式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)

二、AngularJs是什么

  那几个定义一定要定准了,AngularJs(前边就简称ng了)是1个用来设计动态web应用的结构框架。首先,它是一个框架,不是类库,是像backbone一样提供一整套方案用于设计web应用。它不只是一个javascript框架,因为它的主导其实是对HTML标签的增强,有图有实质,请看官网描述:

 图片 40

  何为HTML标签增强?其实正是使您可见用竹签完结都部队分页面逻辑,具体措施正是因此自定义标签、自定义属性等,这几个HTML原生没有的竹签/属性在ng中有八个名字:指令(directive)。前面会详细介绍。那么,什么又是动态web应用呢?与历史观web系统相分歧,web应用能为用户提供丰裕的操作,能够随用户操作不断更新视图而不开始展览url跳转。ng官方也宣称它更适用于付出CRUD应用,即数据操作相比较多的行使,而非是玩玩或图像处理类应用。

  为了达成那么些,ng引入了有些格外棒的表征,包涵模板机制、数据绑定、模块、指令、信赖注入、路由。通过数量与模板的绑定,能够让咱们摆脱繁琐的DOM操作,而将注意力集中在业务逻辑上。那几个小编将在后头的读书中逐条研商。

  别的1个难点,ng是MVC框架吗?依然MVVM框架?官网有提到ng的设计使用了MVC的基本思维,而又不完全是MVC,因为在书写代码时我们确实是在用ng-controller这些命令(起码从名字上看,是MVC吧),但以此controller处理的作业基本上都以与view举行交互,这么看来又很类似MVVM。让我们把目光移到官网那一个非醒指标title上:“AngularJS
— Superheroic JavaScript MVW Framework”。

  好吧,MVW。W—whatever。随就是MV什么好了,所以也有人写为了MV*。其实纠结那一个也真没须求,等未来对任何框架纯熟了,在那之中组织自然明白于心。

2)template——index.html

  3.过滤器(filter)

  所谓过滤器是指对输出的始末举行格式化,如格式化为澳元、日期等。框架自个儿提供部分过滤器,如排序、字符串内容筛选。我们也足以自定义过滤器。

  过滤器在{{}}中选择,表明式后用|隔离使用。拿日期过滤器举例,方式如下:

$scope.nowTime = new Date().valueOf();
{{nowTime | date : 'yyyy-MM-dd HH:mm:ss'}}

  便会输出格式化的日期。是还是不是很有益啊。

  接下去实战一下,哗~

  接上一步的事例,小编想要在预览区域中的题如今边显示题型,像[单选题]诸如此类。大家的questionModel中,type的值是1和2,所以我们要做的正是经过过滤器,把1和2来得为单选题和多选题。Go~

  在js中定义1个名为typeFilter的过滤器:

图片 41

图片 42

app.filter('typeFilter',function(){
    var f = function(input){
        return input == '1' ? '单选题' : '多选题';
    }
    return f;
});

图片 43

图片 44

  filter函数怎么着选用以及执行细节不是本篇的研究内容,所以未来即使理解那样能够定义八个过滤器就足以了。结构姑且认为是固定写法,代码简单看懂。

概念后这么些filter后大家便得以在模板中运用了:

<b>[{{question.type | typeFilter}}]{{question.name}}</b>({{question.fraction}}分)

  在题目的日前展现题型,并选取typeFilter,效果如下:

 图片 45

  单调的“1”已经华丽转身变为了“单选题”。那只是3个简便的过滤器。你能够公布想象力编写更强大的过滤器。

4)在表与表的一连中有related_name属性能够起名用于反向查询,当然不写有默许(表名_set),一对一关联能够平素用表名 

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

 

一定因为没用使用不做示范
用法与其余多少个涉及相同

相关随笔推荐:

searchbook.html

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

annotate的重回值是querySet

② 、template模版的宏图

以此图书的小练习中的表没有一定关联用法用任何四个涉及基本相同

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

图片 46图片 47

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

1)语法

图片 48

一对一:
models.OneToOneField() ===>models.ForeignKey(,unique="True")
一对多:
models.ForeignKey()
多对多:
models.ManyToManyField()

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

View
Code

演练四亟待在本建表实例上添加3个authorDetail小编详细音信表将电话号等详细新闻放进去与作者表建立一对一关系

2)添加图书

2)多对多询问

虽说修改比较简单就一句update化解,但是因为以后图书表和笔者表是多对多连接所以在革新书籍表时须要明白此前的连键和建立新的连年,语法在头里都有教学在代码中也都标志出来了。

您若是在建表风尚未添加主键,django会自动给大家的表添加叁个主键id,是还是不是很棒0.0

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

1、model 建表

 

 

b = Blog.objects.get(id=1)
b.entry_set.clear()

伍 、修改表记录

1)聚合:aggregate()

# 练习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")

图片 49图片 50

③ 、查询实例

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


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

图片 51图片 52

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

询问有关API前面包车型地铁小说已经写到
单表查询还有双下划线查询0.0

6、删除表记录

1)views

一 、准备干活

editbook.html

View
Code

 

index.html

b = Blog.objects.get(id=1)
e = Entry.objects.get(id=234)
b.entry_set.remove(e)

贰 、基于对象的跨表查询

图书、出版社、作者

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),
]

1)成立贰个项目

图片 53图片 54

1)首页

推荐介绍应用第三种格局第两种方法在你明白外键publish_id确切的值时能够利用

View
Code

 

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

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

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

正向查询

2、template 模版

一、建表

伍 、部分效益图

修改和从前的一样依旧update相比不难就不做详细解释了直接上实例

# 金瓶眉所有作者的名字

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

for author_obj in authors:
    print(author_obj.name)

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

当然大家绑定的关联也可以清除:

3)remove

addbook.html

 

3)练习

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

 

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

1、一对多添加语法**

图片 55

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

反向查询

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

叁 、添加表记录

b = Blog.objects.get(id=1)
e = Entry.objects.get(id=234)
b.entry_set.add(e)
#图书表
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

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

View
Code

创制一个新的指标,保存对象,并将它添加到关联对象集之中。重回新成立的对象。

3、url 分发

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

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

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()      #创建并保存一个新对象,然后将这个对象加被关联对象的集合中,然后返回这个新对象。

本篇导航:

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

图片 56

 

3回也询问多个能够

Django
还提供了一种直观而敏捷的法门在询问中意味着关联关系这就是兵不血刃的双划线

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

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

3)修改图书消息

图片 57图片 58

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/")

3)修改相关setting配置。(详情能够参照后边6叁 、6肆 、65三篇小说)

1)add

② 、多对多添加语法

反向查询

3、注意

#统计每一本书的作者个数
bookList=Book.objects.annotate(authorsNum=Count('authors'))
for book_obj in bookList:
    print(book_obj.title,book_obj.authorsNum)

实例:

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

四 、查询表记录

View
Code

{% 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 %}
book_obj.authorlish.remove()     # 将某个特定的对象从被关联对象集合中去除。    ======   book_obj.authors.remove(*[])
book_obj.authorlish.clear()       #清空被关联对象集合。

4)clear

2)create

正向查询

图片 59

图片 60图片 61

b = Blog.objects.get(id=1)
e = b.entry_set.create(
    headline='Hello',
    body_text='Hi',
    pub_date=datetime.date(2005, 1, 1)
)
# 查询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)

图片 62图片 63

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

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

2)分组:annotate() 

五 、聚合查询与分组查询

前边几篇小说的数据库增加和删除改查操作都是在单表的操作上的,不过现实中不或许都是单表操作,越多的是多表操作,一对一,一对多,多对多的表结构才是大家平时必要处理的,本篇将带大家询问多表操作的一部分有关操作。也会带着大家做四个简短的图书管理的小练习。

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

图片 64图片 65

 


图片 66图片 67

4)搜索框搜索图书

字典的key默认(字段名__函数名)也足以协调起名字average_price

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

View
Code

3)外键字段 ForeignKey 有多个 null=True
的安装(它同意外键接受空值 NULL),你可以赋给它空值 None 。

<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)一对多询问

2、建表

# 统计每一个出版社的最便宜的书
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")

图片 68图片 69

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 

图片 70图片 71

View
Code

肆 、views 视图函数

壹 、双下划线单表查询

发表评论

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

网站地图xml地图