赞
踩
上下文管理器
多对多关联
分页
丰富django admin
form
1.概念:上下文处理器是可以返回一些数据,在全局模板中都可以使用。比如登录后的用户信息,在很多页面中都需要使用,那么我们可以放在上下文处理器中,就没有必要在每个视图函数中都返回这个对象。
2.为何要使用?
如果我们不使用上下文处理器的话,那么我们需要在每一个视图函数中都去获取一下session中的user_id,这就是一件很不爽的事情了,而如果我们定义了上下文处理器,那么我们就不需要每一个视图函数中都去获取session中user_id的值了,只需要在上下文处理器中去获取就是了。
3.app目录下新建一个context_processors.py的文件
from . import models
def category_process(request):
categories = models.Category.objects.filter(is_delete=False)
return {'nav':categories}
def site_process(request):
site_name = '王庆柱的博客'
desc = "今天很困,一会要抽烟"
return locals() #把当前函数里面的局部变量都返回
4.sitting.py进行配置
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'html') ] , 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'user.process_content.category_process', #上下文处理器 'user.process_content.site_process' ], }, }, ]
模板继承
建立一个base.html
模板的继承,主要的作用就是实现模板内html代码的重复利用,方便维护和修改,比如一个网站每个网页的页头和页脚信息固定,这样就不需要在每个html页面加入页头和页尾代码,只需要在一个html文件中创建一个模板,其他html页面直接引用即可
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {% block test1 %} “此处是要展示的页头信息” {% endblock %} {% block content %} "此处是要替换的内容" {% endblock %} {% block test2 %} “此处是要展示的页尾信息” {% endblock %} </body> </html>
其中的两个block就是等待被继承的信息。
此时如果要文件home.html来继承,在文件里面直接展示出页头和页尾信息,这样就只需要在home中引用base.html
{% extends ‘base.html’ %}
然后再指定需要替换的模板,比如我是要在home中,保持home内容完全展示的基础上,再加上页头和页尾信息。
这样,我就只需要替换{% block content %}
“此处是要替换的内容”
{% endblock %} 这个block中的内容,保留页头和页尾的block。具体的实现如下
{% extends 'base.html' %} {% load my_tag %} {% block content %} <article> <aside> <div class="l_box" id="stickMe"> <div class="about_me"> <h2>关于我</h2> <ul> <i><img src="/static/images/4.jpg"></i> <p>{{ desc }}</p> </ul> </div> <div class="wdxc"> <h2>我的相册</h2> <ul> <li><a href="/"><img src="/static/images/7.jpg"></a></li> </ul> </div> <div class="search"> <form action="/e/search/index.php" method="post" name="searchform" id="searchform"> <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"> <input name="show" value="title" type="hidden"> class="input_submit" value="搜索" type="submit"> </form> </div> <div class="fenlei"> <h2>文章分类</h2> <ul> <li><a href="/">学无止境(33)</a></li> </ul> </div> <div class="tuijian"> <h2>站长推荐</h2> <ul> <li><a href="/">你是什么人便会遇上什么人</a></li> </ul> </div> <div class="links"> <h2>友情链接</h2> <ul> <a href="http://www.yangqq.com">杨青个人博客</a> <a href="http://www.yangqq.com">杨青博客</a> </ul> </div> <div class="guanzhu"> <h2>关注我 么么哒</h2> <ul> <img src="/static/images/wx.jpg"> </ul> </div> </div> </aside> <div class="r_box"> {% for aricle in articles %} <li><i> {# <a href="/detail?id={{ aricle.id }}">#} <a href="{% url 'xiangqing' %}?id={{ aricle.id }}"> <img src="/static/{{ aricle.img }}"></a></i> <h3><a href="{% url 'xiangqing' %}?id={{ aricle.id }}">{{ aricle.title }}</a></h3> {# <p>{{ aricle.desc }}</p>#} <p>{{ aricle.desc | abc:5 }}</p> {# <p>{% abc2 ricle.desc 20 %}</p>#} </li> {% endfor %} {% if articles.has_other_pages %} <div class="pagelist"> {% if articles.has_previous %} <a href="/index?page={{ articles.previous_page_number }}&limit=10" ><b>上一页</b></a> {% endif %} {% for page_num in articles.paginator.page_range %} <a href="/index?page={{ page_num }}&limit=10" >{{ page_num }}</a> {% endfor %} {% if articles.has_next %} <a href="/index?page={{ articles.next_page_number }}&limit=10">下一页</a> {% endif %} </div> {% endif %} </div> </article> {% endblock %}
分页后端实现
paginator
from django.core.paginator import Paginator
from . import const
def index(request):
category_id = request.GET.get('category_id',1) #?category_id=xx
page = request.GET.get('page',1)
limit = request.GET.get('limit',const.page_size)
article = Article.objects.filter(is_delete=False,category_id=category_id)
page_obj = Paginator(article,limit)
page_data = page_obj.page(page)
data = {'articles':page_data}
return render(request,'index.html',data)
page_size = 10 #默认分页数量
分页前端实现
{% if articles.has_other_pages %} <div class="pagelist"> {% if articles.has_previous %} <a href="/index?page={{ articles.previous_page_number }}&limit=10" ><b>上一页</b></a> {% endif %} {% for page_num in articles.paginator.page_range %} <a href="/index?page={{ page_num }}&limit=10" >{{ page_num }}</a> {% endfor %} {% if articles.has_next %} <a href="/index?page={{ articles.next_page_number }}&limit=10">下一页</a> {% endif %}
from django.core.paginator import Paginator page_obj = Paginator(Article.objects.all(),2) print(list(page_obj.page(1))) print(page_obj.page(1)) #取某一页的数据 print(page_obj.count) #总共多少条 print(page_obj.num_pages) #总共分了多少页 print(page_obj.page_range) #分页的范围 cur_page = page_obj.page(1) print(cur_page.has_previous()) #判断是否有上一页 # print(cur_page.previous_page_number()) print(cur_page.has_next())#判断是否有下一页
丰富django admin
优化自带的
INSTALLED_APPS = [
'simpleui',
from django.contrib import admin # Register your models here. from . import models class ArticleAdmin(admin.ModelAdmin): list_display = ['title', 'category', 'create_time', 'update_time'] #显示哪些字段 search_fields = ['title'] #哪写字段可以搜索,不要写外键的字段 list_filter = ['category','is_delete'] list_per_page = 10 #每页显示多少条 class CategoryAdmin(admin.ModelAdmin): list_display = ['name', 'create_time', 'update_time'] #显示哪些字段 search_fields = ['name'] #哪写字段可以搜索,不要写外键的字段 list_filter = ['is_delete'] list_per_page = 10 #每页显示多少条 admin.site.register(models.Category,CategoryAdmin) admin.site.register(models.Article,ArticleAdmin)
解决跨域问题
pip install django-cors-headers
前端自定义标签
templatetags包-my_tag.py
from django import template
register = template.Library()
@register.filter #最多就2个参数
def abc(s,length=10):
if len(s)>length:
s = s[:11]+'....'
return s
@register.simple_tag
def abc2(s,length=10):
if len(s)>length:
s = s[:11]+'....'
return s
{% load my_tag %}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。