过滤器 自定义查询

{{ item.date|date:'Y-m-d H:i:s' }}这种筛选器的效果是打印出 年 月 日 小时 分钟 秒
<p><span class="tutime font-size-18"><a href='{% url 'archive' %}?year={{ archive slice:":4" }}&month={{ archive slice:"5:7" }}'>{{ archive }}</a></span></p>
这个截取到底是怎么截取的?

就是根据存储字符串从起始位置开始截取


自定义过滤器:
DoseNotExist异常,如果使用get没有获得对象,那么返回一个DoseNotExist异常
safe过滤器,把html转换成页面信息,不会直接打印出来
在templatetags包里面定义一个html使用的时候需要加载到html当中
在此html当中
from django import template
register = remplate.Library()
 
@register.filter
def month_to_upper(key):
    return[] [key.month-1]
 
register.filter('month_to_upper',month_to_upper)

自定义筛选器

在app下定义一个templatetags包,创建要写的筛选器.py文件

 

from django import template
register = template.Library()
def percent(value):
return value +'%'
register.filter(percent)
使用之前先load
{% load percent %}
<li>today is {{datetime | date:'Y-m-d' | percent}}</li>
 
过滤器还可以组合起来是用,不同的组合还会有不同的效果
直接把blog里面定义过来的filter拷贝过来看
# -*- coding: utf-8 -*-
from django import template
register = template.Library()
 
# 定义一个将日期中的月份转换为大写的过滤器,如8转换为八
@register.filter
def month_to_upper(key):
return['一','二','三','四','五','六','七','八','九','十','十一','十二'][key.month-1]
 
# 注册过滤器
# register.filter('month_to_upper', month_to_upper)
跟定义标签类似,但实现的功能更为强大


自定义文章model的管理器,因为想要实现按年月吧文章归档的操作实现不了,所以自定义一个model来实现这个功能有两种方式 1:新加一个数据处理的方法2.改变原有的queryset,就是重新定义这个方法,改变这个方法的返回主要使用第一种方法
在models.py里面自定义Model管理器
class ArticleManager(models.Manager):
distinct_date_list = []
    def distinct_date(self):
date_list = self.values('date_publish')
#把日期的结果取出来
for date in date_list:
date = date['date_publish'].strftime('%Y%m文章存档')
if date not in distinct_date_list:
distinct_date_list.append(date)
return distinct_date_list
在Article的类中进行设置
objects = ArticleManager()
再views.py里面进行设置archive_list = Article.objects.distinct_date()

在base.html当中进行设置
<ul>
{% for archive in archive_list %}
<li>
<p><span class="tutime font-size-18"><a href=''>{{ archive }}</a></span></p>
</li>
{% endfor %}
</ul>
这样设置后网页上不会出现需要显示的归档信息,原因是编码问题
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
导入这个在models.py里面就可以了
http://blog.csdn.net/crazyhacking/article/details/39375535
http://blog.csdn.net/intel80586/article/details/8566057
python在解码的时候默认 以ASCLL码的方式进行解码




后面可以忽略靠,今天实在是太粗心了,好恶心,就这么几分钟就能搞定的事情,花了我近一个小时,日
url(r'^archive/$',archive,name='archive') 

url配置的时候,前面要加上 ^ 后米加上/$  $不会影响传入的参数
配置archive.html
复制了index.html到archive.html当中,在views.py写下archive的函数,
在url当中进行引用,再到base.html当中进行设置
<p><span class="tutime font-size-18"><a href='{% url 'archive' %}?year={{ archive | slice:":4" }}&month={{ archive | slice:"5:7" }}'>{{ archive }}</a></span></p>
使点击分类文章时会跳转到archive.html当中,再到views.html当中进行设置其逻辑结构
将index函数里面的分页查询的代码拷贝下来,就可以显示内容了
article_list = Article.objects.filter(date_publish__icontains=year+'-'+month)
修改查询的操作,这样只会照到指定参数的内容
到archieve.html当中做一些修改
<h2>{{ request.GET.year }}/{{ request.GET.month }}归档文章</h2>
发现在这里也可以使用传进来的参数
这里需要传入参数,因为QuerySet查询是惰性的,不会一下子查询出所有的记录只会查询出当前页面的内容,所以当跳转页面的时候,应该重新传入参数
 

自定义过滤器:

定义一个myfilter.py文件
from django import template
register = template.Library()
导入template库,从Library获得register注册对象,用来注册过滤器
使用自定义过滤器的时候需要导入过滤器文件{% load <div class="month">{{ article.date_publish month_to_upper }}</div>
在blog下面定义一个templatetags包,myfilter %}
def month_to_upper(key):
return ['', '', '', '', '', '', '', '', '', '', '十一', '十二'][key.month-1]
然后注册过滤器# register.filter('month_to_upper', month_to_upper)
或者@register.filter


















原文地址:https://www.cnblogs.com/wuqingzangyue/p/5749564.html