django--14(完整)

一、上下文管理器

作用 每次执行完view都会执行上下文管理器内容的,简化代码

1、每个view里面都需要用到的操作,那你就放到上下文管理器里面查
2、先定义一个函数,函数必须有一个参数,是request
3、这个函数要返回一个字典
4、要加在配置文件里面 TEMPLATES=>options=>

  1)user目录下创建python文件process_content.py(文件名自己定义)

内容如下

1 from . import models
2 
3 def category_process(request):
4     print('category_process....')
5     categories = models.Category.objects.filter(is_delete=False)#将所有的分类返回
6     return {'nav':categories}

  2)settings.py文件中配置新建文件的路径

  3)view.py 将重复内容去除

 1 def index(request):
 2     print('view....index')
 3     # catagories = Category.objects.filter(is_delete=False)
 4     article = Article.objects.filter(is_delete=False)
 5     data = {'articles':article}
 6     return render(request,'index.html',data)
 7 
 8 def category(request,id):
 9     print('category....index')
10     # catagories = Category.objects.filter(is_delete=False)
11     article = Article.objects.filter(is_delete=False,category_id=id)
12     data = {'articles':article}
13     return render(request,'index.html',data)

  4)进入index 页面,修改内容刷新,显示正常;点击分类后,日志中显示打印内容

 5) 页面显示如图:

 

实例站点信息:

  1)user目录下创建python文件process_content.py(文件名自己定义)

内容如下

1 def site_process(request):
2     print('site_process....')
3     site_name = '洋洋的博客'
4     desc = '今天有点累'
5     return locals()#函数的意思相当于返回如下信息
6     # return {'site_name':'***','desc':'***'}

  2)settings.py文件中配置新建文件的路径

   3)index.html替换两处

1 class="l_box" id="stickMe">
2       <div class="about_me">
3         <h2>关于我</h2>
4         <ul>
5           <i><img src="/static/images/4.jpg"></i>
6           <p>{{ desc }}</p>
7         </ul>

 

 

  4)刷新首页--日志效果

 

  5)首页最终效果:

二、模板继承

实现点击文章标题跳转到文章详情页面(复制info.html到templates目录下,更改下部分内容 )注意:建议新建info.html,将文件内容复制,防止乱码或报错

1、views.py实现文章详情页面接口逻辑

1 def detail(request):
2     # categories = Category.objects.filter(is_delete=False,)
3     id = request.GET.get('id')#文章id
4     result = Article.objects.filter(id = id).first()
5     if result:
6         return render(request,'info.html',{'article':result})
7     else:
8         return Http404

2、配置urls.py

15 """
16 from django.contrib import admin
17 from django.urls import path
18 from user.views import index,category,detail
19 urlpatterns = [
20     path('admin/', admin.site.urls),
21     path('index/', index),
22     path('', index),
23     path('category/<int:id>', category),
24     path('detail/', detail()),
25 ]

3、将模板中的文章详情页面复制到templates目录下,更改css,js,images路径,更改文章标题,简介,内容,更新时间等,将详情页面的分类导航更改成和首页一致

4、info.html中修改配置内容

1)info.html中修改内容1

2)info.html 中修改内容2

3)info.html中修改内容3

 

4)index.html中修改文章列表中配置的链接

 5、效果

1)列表页鼠标放在文章列表处,页面底部显示文章详情页面的链接

 2)点击文章列表进入到文章详情页面

继承:

1、将页面公共的部分单独写在一个文件中,标记可变的部分

2、新建base.html,为了单独页面可能访问js,css,节省网速要预留js,css口

base.html

 1 <!doctype html>
 2 <html>
 3 <head>
 4 <meta charset="utf-8">
 5 <title>首页_杨青个人博客 - 一个站在web前端设计之路的女技术员个人博客网站</title>
 6 <meta name="keywords" content="个人博客,杨青个人博客,个人博客模板,杨青" />
 7 <meta name="description" content="杨青个人博客,是一个站在web前端设计之路的女程序员个人网站,提供个人博客模板免费资源下载的个人原创网站。" />
 8 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 9 <link href="/static/css/base.css" rel="stylesheet">
10 <link href="/static/css/index.css" rel="stylesheet">
11 <link href="/static/css/m.css" rel="stylesheet">
12 <script src="/static/js/jquery.min.js" type="text/javascript"></script>
13 <script type="text/javascript" src="/static/js/hc-sticky.js"></script>
14 <script type="text/javascript" src="/static/js/comm.js"></script>
15     {% block css %}
16 {#        <link href="/static/css/base.css" rel="stylesheet">#}
17     {% endblock %}
18 
19 </head>
20 <body>
21 <header class="header-navigation" id="header">
22   <nav><div class="logo"><a href="/">{{ site_name }}</a></div>
23     <h2 id="mnavh"><span class="navicon"></span></h2>
24     <ul id="starlist">
25         {% for n in nav %}
26       <li><a href="/category/{{ n.id }}">{{ n.name }}</a></li>
27     {% endfor %}
28     </ul>
29 </nav>
30 </header>
31 {% block content %}
32 {% endblock %}
33 
34 <footer>
35   <p>Design by <a href="http://www.yangqq.com" target="_blank">杨青个人博客</a> <a href="/">蜀ICP备11002373号-1</a></p>
36 </footer>
37 <a href="#" class="cd-top">Top</a>
38 {% block js %}
39 {% endblock %}
40 </body>
41 </html>

index.html

 1 {% extends 'base.html' %}
 2 {% block content%}
 3 <article>
 4   <aside>
 5     <div class="l_box" id="stickMe">
 6       <div class="about_me">
 7         <h2>关于我</h2>
 8         <ul>
 9           <i><img src="/static/images/4.jpg"></i>
10           <p>{{ desc }}</p>
11         </ul>
12       </div>
13       <div class="wdxc">
14         <h2>我的相册</h2>
15         <ul>
16           <li><a href="/"><img src="/static/images/7.jpg"></a></li>
17           <li><a href="/"><img src="/static/images/8.jpg"></a></li>
18           <li><a href="/"><img src="/static/images/9.jpg"></a></li>
19           <li><a href="/"><img src="/static/images/10.jpg"></a></li>
20           <li><a href="/"><img src="/static/images/11.jpg"></a></li>
21           <li><a href="/"><img src="/static/images/12.jpg"></a></li>
22         </ul>
23       </div>
24       <div class="search">
25         <form action="/e/search/index.php" method="post" name="searchform" id="searchform">
26           <input name="keyboard" id="keyboard" class="input_text" value="请输入关键字词" style="color: rgb(153, 153, 153);" onfocus="if(value=='请输入关键字词'){this.style.color='#000';value=''}" onblur="if(value==''){this.style.color='#999';value='请输入关键字词'}" type="text">
27           <input name="show" value="title" type="hidden">
28           <input name="tempid" value="1" type="hidden">
29           <input name="tbname" value="news" type="hidden">
30           <input name="Submit" class="input_submit" value="搜索" type="submit">
31         </form>
32       </div>
33       <div class="fenlei">
34         <h2>文章分类</h2>
35         <ul>
36           <li><a href="/">学无止境(33)</a></li>
37           <li><a href="/">日记(19)</a></li>
38           <li><a href="/">慢生活(520)</a></li>
39           <li><a href="/">美文欣赏(40)</a></li>
40         </ul>
41       </div>
42       <div class="tuijian">
43         <h2>站长推荐</h2>
44         <ul>
45           <li><a href="/">你是什么人便会遇上什么人</a></li>
46           <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
47           <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
48           <li><a href="/">个人博客模板《绅士》后台管理</a></li>
49           <li><a href="/">你是什么人便会遇上什么人</a></li>
50           <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
51           <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
52           <li><a href="/">个人博客模板《绅士》后台管理</a></li>
53         </ul>
54       </div>
55       <div class="links">
56         <h2>友情链接</h2>
57         <ul>
58           <a href="http://www.yangqq.com">杨青个人博客</a> <a href="http://www.yangqq.com">杨青博客</a>
59         </ul>
60       </div>
61       <div class="guanzhu">
62         <h2>关注我 么么哒</h2>
63         <ul>
64           <img src="/static/images/wx.jpg">
65         </ul>
66       </div>
67     </div>
68   </aside>
69   <div class="r_box">
70       {% for aricle in articles %}
71 
72     <li><i><a href="/detail?id={{ aricle.id }}"><img src="/static/{{ aricle.img }}"></a></i>
73 
74       <h3><a href="/detail?id={{ aricle.id }}">{{ aricle.title }}</a></h3>
75       <p>{{ aricle.desc }}</p>
76     </li>
77 
78       {% endfor %}
79 
80   </div>
81 </article>
82 {% endblock %}

 三、分页后端实现

1、后端接口简单实现

 1 import django,os
 2 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dj_test.settings')
 3 django.setup()
 4 
 5 L = range(1,51)#实际需要从数据库中查出文章
 6 from django.core.paginator import Paginator
 7 page_obj = Paginator(L,20)
 8 print(list(page_obj.get_page(1)))#取某一页的数据
 9 print(list(page_obj.get_page(2)))
10 print(list(page_obj.get_page(3)))
11 print(page_obj.count)#总共多少条数据
12 print(page_obj.num_pages)#总共分了多少页
13 print(page_obj.page_range)#分页的范围1,2,3
14 
15 cur_page = page_obj.get_page(1)
16 print(cur_page.previous_page_number())#当前页的上一页
17 print(cur_page.next_page_number())#当前页的下一页
18 print(cur_page.has_next())#判断是否有下一页
19 print(cur_page.has_previous())#判断是否有上一页
20 print(cur_page.has_other_pages())#判断是否有其他页
21
print(cur_page.paginator)#当前页的分页对象,就是page_obj

2、具体应该到博客项目中

方案1:规定好每页显示多少条数据

1)当前路径增加文件const.py

1 page_size = 10#默认分页数量

2)views.py中首页文章列表接口实现

 1 def index(request):
 2     #/index/1 #需要改变代码
 3     #/index?page=1#不需要改变代码
 4     print('view....index')
 5     page = request.GET.get('page',1)#前端传过来的页码
 6     article = Article.objects.filter(is_delete=False)#查出数据库中所有没有被删除的文章
 7     page_obj = Paginator(article,const.page_size)#文章分页
 8     page_data= page_obj.get_page(page)#取到当前页面的数据
 9     data = {'articles':page_data}#数据
10     return render(request,'index.html',data)#返回数据

方案2:前端传每页显示多少条数据

 1 from django.core.paginator import Paginator#分页用的方法
 2 from . import const
 3 # Create your views here.
 4 
 5 
 6 def index(request):
 7     #/index/1 #需要改变代码
 8     #/index?page=1#不需要改变代码
 9     print('view....index')
10     page = request.GET.get('page',1)#前端传过来的页码
11     limit = request.GET.get('limit', const.page_size)  # 前端传过来,每页显示多少数据
12     article = Article.objects.filter(is_delete=False)#查出数据库中所有没有被删除的文章
13     page_obj = Paginator(article,limit)#文章分页
14     page_data= page_obj.get_page(page)#取到页码数据
15     data = {'articles':page_data}#数据
16     return render(request,'index.html',data)#返回数据

 四、分页前端实现

修改index.html文件内容--整体思路如下

  1、先判断是否存在其他页面,有其他页面的时候才需要分页

  2、判断是否存在上一页,上一页的链接

  3、页面循环

  4、判断是否存在下一页,下一页的链接

 1 {% extends 'base.html' %}
 2 {% block content%}
 3 <article>
 4   <aside>
 5     <div class="l_box" id="stickMe">
 6       <div class="about_me">
 7         <h2>关于我</h2>
 8         <ul>
 9           <i><img src="/static/images/4.jpg"></i>
10           <p>{{ desc }}</p>
11         </ul>
12       </div>
13       <div class="wdxc">
14         <h2>我的相册</h2>
15         <ul>
16           <li><a href="/"><img src="/static/images/7.jpg"></a></li>
17           <li><a href="/"><img src="/static/images/8.jpg"></a></li>
18           <li><a href="/"><img src="/static/images/9.jpg"></a></li>
19           <li><a href="/"><img src="/static/images/10.jpg"></a></li>
20           <li><a href="/"><img src="/static/images/11.jpg"></a></li>
21           <li><a href="/"><img src="/static/images/12.jpg"></a></li>
22         </ul>
23       </div>
24       <div class="search">
25         <form action="/e/search/index.php" method="post" name="searchform" id="searchform">
26           <input name="keyboard" id="keyboard" class="input_text" value="请输入关键字词" style="color: rgb(153, 153, 153);" onfocus="if(value=='请输入关键字词'){this.style.color='#000';value=''}" onblur="if(value==''){this.style.color='#999';value='请输入关键字词'}" type="text">
27           <input name="show" value="title" type="hidden">
28           <input name="tempid" value="1" type="hidden">
29           <input name="tbname" value="news" type="hidden">
30           <input name="Submit" class="input_submit" value="搜索" type="submit">
31         </form>
32       </div>
33       <div class="fenlei">
34         <h2>文章分类</h2>
35         <ul>
36           <li><a href="/">学无止境(33)</a></li>
37           <li><a href="/">日记(19)</a></li>
38           <li><a href="/">慢生活(520)</a></li>
39           <li><a href="/">美文欣赏(40)</a></li>
40         </ul>
41       </div>
42       <div class="tuijian">
43         <h2>站长推荐</h2>
44         <ul>
45           <li><a href="/">你是什么人便会遇上什么人</a></li>
46           <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
47           <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
48           <li><a href="/">个人博客模板《绅士》后台管理</a></li>
49           <li><a href="/">你是什么人便会遇上什么人</a></li>
50           <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
51           <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
52           <li><a href="/">个人博客模板《绅士》后台管理</a></li>
53         </ul>
54       </div>
55       <div class="links">
56         <h2>友情链接</h2>
57         <ul>
58           <a href="http://www.yangqq.com">杨青个人博客</a> <a href="http://www.yangqq.com">杨青博客</a>
59         </ul>
60       </div>
61       <div class="guanzhu">
62         <h2>关注我 么么哒</h2>
63         <ul>
64           <img src="/static/images/wx.jpg">
65         </ul>
66       </div>
67     </div>
68   </aside>
69   <div class="r_box">
70       {% for aricle in articles %}
71 
72     <li><i><a href="/detail?id={{ aricle.id }}"><img src="/static/{{ aricle.img }}"></a></i>
73 
74       <h3><a href="/detail?id={{ aricle.id }}">{{ aricle.title }}</a></h3>
75       <p>{{ aricle.desc }}</p>
76     </li>
77 
78       {% endfor %}
79   {% if articles.has_other_page %}
80 
81   <div class="pagelist">
82         {% if artilces.has_previous %}
83                 <a class="allpage" href="/index?page = {{ articles.previous_page_number }}&limit=20"><b>上一页</b></a>&nbsp;&nbsp;
84         {% endif %}
85 
86         {% for page_num in articles.paginator%}
87                 <a href="#" class="curPage">{{ page_num }}</a>&nbsp;&nbsp;
88         {% endfor %}
89 
90         {% if artilces.has_next %}
91                 <a href="/index?page = {{ articles.previous_page_number }}&limit=20">{{ articles.next_page_number }}</a>
92         {% endif %}
93 
94             </div>
95 
96   {% endif %}
97   </div>
98 </article>
99 {% endblock %}

五、优化js样式问题

1、info.html 增加css 样式,文章详情页面样式显示正确

 1 {% extends 'base.html' %}
 2 {% block css %}
 3     <link href="/static/css/info.css" rel="stylesheet">
 4 {% endblock %}
 5 {% block content%}
 6 <article>
 7   <aside>
 8   <div class="l_box">
 9     <div class="search">
10       <form action="/e/search/index.php" method="post" name="searchform" id="searchform">
11         <input name="keyboard" id="keyboard" class="input_text" value="请输入关键字词" style="color: rgb(153, 153, 153);" onfocus="if(value=='请输入关键字词'){this.style.color='#000';value=''}" onblur="if(value==''){this.style.color='#999';value='请输入关键字词'}" type="text">
12         <input name="show" value="title" type="hidden">
13         <input name="tempid" value="1" type="hidden">
14         <input name="tbname" value="news" type="hidden">
15         <input name="Submit" class="input_submit" value="搜索" type="submit">
16       </form>
17     </div>
18     <div class="fenlei">
19       <h2>文章分类</h2>
20       <ul>
21         <li><a href="/">学无止境(33)</a></li>
22         <li><a href="/">日记(19)</a></li>
23         <li><a href="/">慢生活(520)</a></li>
24         <li><a href="/">美文欣赏(40)</a></li>
25       </ul>
26     </div>
27     <div class="tuijian">
28       <h2>站长推荐</h2>
29       <ul>
30         <li><a href="/">你是什么人便会遇上什么人</a></li>
31         <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
32         <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
33         <li><a href="/">个人博客模板《绅士》后台管理</a></li>
34         <li><a href="/">你是什么人便会遇上什么人</a></li>
35         <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
36         <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
37         <li><a href="/">个人博客模板《绅士》后台管理</a></li>
38       </ul>
39     </div>
40     <div class="tuijian">
41       <h2>点击排行</h2>
42       <ul>
43         <li><a href="/">你是什么人便会遇上什么人</a></li>
44         <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
45         <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
46         <li><a href="/">个人博客模板《绅士》后台管理</a></li>
47         <li><a href="/">你是什么人便会遇上什么人</a></li>
48         <li><a href="/">帝国cms 列表页调用子栏目,没有则不显示栏目名称</a></li>
49         <li><a href="/">第二届 优秀个人博客模板比赛参选活动</a></li>
50         <li><a href="/">个人博客模板《绅士》后台管理</a></li>
51       </ul>
52     </div>
53     <div class="cloud">
54       <h2>标签云</h2>
55       <ul>
56         <a href="/">陌上花开</a> <a href="/">校园生活</a> <a href="/">html5</a> <a href="/">SumSung</a> <a href="/">青春</a> <a href="/">温暖</a> <a href="/">阳光</a> <a href="/">三星</a><a href="/">索尼</a> <a href="/">华维荣耀</a> <a href="/">三星</a> <a href="/">索尼</a>
57       </ul>
58     </div>
59     <div class="guanzhu">
60       <h2>关注我 么么哒</h2>
61       <ul>
62         <img src="/static/images/wx.jpg">
63       </ul>
64     </div>
65   </div>
66   </aside>
67   <div class="infosbox">
68     <div class="newsview">
69       <h3 class="news_title">{{ article.title }}</h3>
70       <div class="bloginfo">
71         <ul>
72           <li class="author">作者:<a href="/">杨青</a></li>
73           <li class="lmname"><a href="/">学无止境</a></li>
74           <li class="timer">{{ article.create_time }}</li>
75           <li class="view">4567人已阅读</li>
76         </ul>
77       </div>
78       <div class="tags"><a href="/" target="_blank">个人博客</a> &nbsp; <a href="/" target="_blank">小世界</a></div>
79       <div class="news_about"><strong>简介</strong>{{ article.desc }}</div>
80       <div class="news_con">
81           {{ article.content }}
82         &nbsp; </div>
83     </div>
84     <div class="share">
85       <p class="diggit"><a href="JavaScript:makeRequest('/e/public/digg/?classid=3&amp;id=19&amp;dotop=1&amp;doajax=1&amp;ajaxarea=diggnum','EchoReturnedText','GET','');"> 很赞哦! </a>(<b id="diggnum"><script type="text/javascript" src="/e/public/ViewClick/?classid=2&id=20&down=5"></script>13</b>)</p>
86     </div>
87     <div class="nextinfo">
88       <p>上一篇:<a href="/news/life/2018-03-13/804.html">作为一个设计师,如果遭到质疑你是否能恪守自己的原则?</a></p>
89       <p>下一篇:<a href="/news/life/">返回列表</a></p>
90     </div>
91     <div class="news_pl">
92       <h2>文章评论</h2>
93       <ul>
94         <div class="gbko"> </div>
95       </ul>
96     </div>
97   </div>
98 </article>
99 {% endblock %}

 六、优化冗余代码

1、由于index和category 接口内容很接近,可以修改简化代码

1)前端代码修改,由于访问的链接形式是/index?category_id =1,所有修改如下

 1 <header class="header-navigation" id="header">
 2   <nav><div class="logo"><a href="/">{{ site_name }}</a></div>
 3     <h2 id="mnavh"><span class="navicon"></span></h2>
 4     <ul id="starlist">
 5         {% for n in nav %}
 6       <li><a href="/index?category_id={{ n.id }}">{{ n.name }}</a></li>
 7     {% endfor %}
 8     </ul>
 9 </nav>
10 </header>

2)后端代码修改views.py,去除category方法

 1 def index(request,id = 1):
 2     #/index/1 #需要改变代码
 3     #/index?page=1#不需要改变代码
 4     print('view....index')
 5     category_id = request.GET.get('category_id',1)
 6     page = request.GET.get('page',1)#前端传过来的页码
 7 
 8     article = Article.objects.filter(is_delete=False,category_id = category_id)#查出数据库中所有没有被删除的文章
 9     # page_obj = Paginator(article,const.page_size)#规定好每页返回多少数据
10 
11     limit = request.GET.get('limit', const.page_size)  # 前端传过来,每页显示多少数据
12     page_obj = Paginator(article,limit)#文章分页
13 
14     page_data= page_obj.get_page(page)#当前页面
15     data = {'articles':page_data}#数据
16     return render(request,'index.html',data)#返回数据

3)urls.py去除分类路径

 1 from django.contrib import admin
 2 from django.urls import path
 3 from user.views import index,detail
 4 urlpatterns = [
 5     path('admin/', admin.site.urls),
 6     path('index/', index),
 7     path('', index),
 8     # path('category/<int:id>', category),
 9     path('detail/', detail),
10 ]

七、丰富django admin

 1、查询文章id为1或者id为2

from django.db.models import Q
r = Article.objects.filter( Q(category_id=1) | Q(category_id=2) )
print(r)

2、pip install simpleui 美化 Django admin

在settings.py文件中增加如图

 

 

 重新启动Django后,进入admin

 

 

 备注解决问题

问题1:

 

 

 

打开pycharm界面,点击下方的Terminal命令行,输入数据迁移命令:

python3 manage.py migrate

问题2:

 

 

 

两种解决办法:

  • 第一种办法是:编辑 settings.py 文件,从 INSTALLED_APPS 配置项中移除 'django.contrib.sites',

  • 第二种办法:通过 python manage.py shell 为 Site model 添加一条记录(将网站的域名添加进去):

    $ python manage.py shell
    
    >>> from django.contrib.sites.models import Site
    >>> Site.objects.create(pk=1, domain='tumblr.3sd.me', name='tumblr.3sd.me')
    <Site: tumblr.3sd.me>
    

3、丰富Django admin admin.py

 1 from django.contrib import admin
 2 
 3 # Register your models here.
 4 from . import models
 5 
 6 class ArticleAdmin(admin.ModelAdmin):
 7     list_display = ['title', 'category', 'create_time', 'update_time'] #显示哪些字段,标题,分类,创建时间,更新时间
 8     search_fields = ['title'] #哪写字段可以搜索,不要写外键的字段
 9     list_filter = ['category','is_delete']#过滤器
10     list_per_page = 10 #每页显示多少条
11 
12 
13 class CategoryAdmin(admin.ModelAdmin):
14     list_display = ['name', 'create_time', 'update_time'] #显示哪些字段
15     search_fields = ['name'] #哪写字段可以搜索,不要写外键的字段
16     list_filter = ['is_delete']
17     list_per_page = 10 #每页显示多少条
18 
19 
20 
21 admin.site.register(models.Category,CategoryAdmin)
22 admin.site.register(models.Article,ArticleAdmin)

文章表

 

文章分类

  

八、前后端分离

 1、创建一个test.html文件

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 7     <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.js"></script>
 8 
 9 </head>
10 <body>
11 
12 <div id="app">
13 
14     <button @click="test">点我</button>
15 
16     {{ msg }}
17 </div>
18 
19 <script>
20 
21     var app = new Vue({
22         el:'#app',
23         data : {
24             msg:'',
25         },
26         methods:{
27             test:function () {
28                 axios.get('http://127.0.0.1:8000/test').then(response=>{
29                     let msg = response.get('msg')
30                     this.msg= msg
31 
32                 })
33 
34 
35             }
36         }
37 
38     });
39 </script>
40 
41 </body>
42 </html>

 

2、views.py 增加方法

1 def test(request):
2     d = {'msg':'ok'}
3     return  JsonResponse(d)

3、test.html文件直接用浏览器打开点击按钮

 

 备注:途中报错是因为跨域,后面详细说明

 

九、前端自定义标签

1、文章描述特别长,大于20个字符显示...

实现方式1:自定义tag

在自己创建的APP名称【user】目录下创建文件夹【templatetags】固定的文件夹名称&Python文件

 

 my_tag.py文件内容

1 from django import template
2 
3 register = template.Library()#固定内容
4 
5 @register.filter #最多就2个参数
6 def abc(s,length=10):
7     if len(s)>length:
8         s = s[:11]+'....'
9     return s

HTML文件中引入并使用新创建的文件,直接调用方法

index.html

1 {% extends 'base.html' %}
2 {% load my_tag %}#引入新建的文件

abc:5 中5表示传参的变量值

实现方式2:当需要参数超过2个时

my_tag.py

from django import template

register = template.Library()#固定内容

@register.simple_tag
def abc2(s,length=10):
    if len(s)>length:
        s = s[:11]+'....'
    return

 

 

 最终效果:

 

 Django前端过滤器

 1 {% load my_tags %}
 2 <!DOCTYPE html>
 3 <html lang="en">
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>Title</title>
 7     <link href="/static/style.css" rel="stylesheet">
 8 </head>
 9 <body>
10     欢迎《{{name}}》登录,今天是 === {{time}} ===
11 
12 
13     {{ stus.0 }}
14     <br>
15     {{ stus |length  }}
16     <br>
17     {{ stus |slice:"0:2"  }}
18     <br>
19     {{ stus |join:"-"  }}
20     <br>
21     {{ name |default:"admin"  }}
22     <br>
23     {{ cur_time |date:"Y-m-d H:i:s"  }}
24     <br>
25     {{ h1_str |safe  }}
26 {#    #xss注入#}
27     <br>
28     {{ h1_str   }}
29     <br>
30     {{ words | truncatechars:20   }}
31     <br>
32     {{ age | add:2   }}
33     <br>
34     {{ name | add:"先生"   }}
35     <br>
36     {{ english_name | upper   }}
37     <br>
38     {{ english_name | lower   }}
39     <br>
40     {{ article_content|mingan }}
41     <br>
42     {{ article_content|mingan2:"金正恩" }}
43     <br>
44     {% mingan3 say "213" "sb" "傻x" %}
45 
46 
47 {#    <ul>#}
48 {#        {% for stu in stus %}#}
49 {#        <li>{{stu}}</li>#}
50 {#        {% endfor%}#}
51 {#    </ul>#}
52 
53 
54 </body>
55 </html>

safe用法

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6 </head>
 7 <body>
 8 {{ s }}
 9 {{ s|safe }}#增加safe
10 
11 </body>
12 </html>

 

未加safe

 

增加safe

 

 

 

posted @ 2020-02-15 18:50  洛歆陌离  阅读(236)  评论(0编辑  收藏  举报