Demo Django_todolist

项目内容

在Django基础项目(ToDoList)的基础上完成以下功能:
1、实现一个中间件,该中间件可以检测到用户浏览器版本信息,如果用户使用的浏览器低于IE9则显示用户升级浏览器的页面,否则不能访问和使用到ToDoList的功能
2、在添加的待办事项里面增加一个发布时间,设计一个过滤器,可以格式化时间显示效果。(显示成发布于1小时前,1天前,1周前,1月前,1年前这样的效果。)

参考文档

代码地址:Spareibs的Github

具体实现

定义一个判断用户源的中间件

这里定义了一个判断用户源的中间件【middleware.py】,这里有一个小bug:判断来源可以不全

from django.http import HttpResponse


class CheckSoureMiddware(object):
    def process_request(self, request):
        from_source = request.META['HTTP_USER_AGENT']
        print('from_source ', from_source)
        if 'MSIE 6.0' in from_source:
            request.session['from_source'] = 'MSIE 6.0'
            return HttpResponse('''<div align="center"><img src="../static/img/old.png" class="alignleft" alt="升级浏览器"/></div>''')
        if 'Trident/7.0' in from_source:
            request.session['from_source'] = 'MSIE 7.0'
            return HttpResponse('''<div align="center"><img src="../static/img/old.png" class="alignleft" alt="升级浏览器"/></div>''')
        if 'Trident/7.0' in from_source:
            request.session['from_source'] = 'MSIE 8.0'
            return HttpResponse('''<div align="center"><img src="../static/img/old.png" class="alignleft" alt="升级浏览器"/></div>''')
        else:
            request.session['from_source'] = 'pc'

将中间件注册

MIDDLEWARE_CLASSES = [
    'todolist.middleware.CheckSoureMiddware',
]

定义一个格式化时间的过滤器

修改数据库相关字段

修改储存时间字段【models.py】

from django.db import models
import django.utils.timezone as timezone

# Create your models here.
class Todolist(models.Model):
    add_date = models.DateTimeField()

同步更新数据库【manage.py】

(env_py35_django) D:\MaiZi_Edu\Dropbox\Maizi\Django_up\django_homework_end>python manage.py makemigrations
Migrations for 'todolist':
  0003_todolist_add_date.py:
    - Add field add_date to todolist

(env_py35_django) D:\MaiZi_Edu\Dropbox\Maizi\Django_up\django_homework_end>python manage.py migrate
Operations to perform:
  Apply all migrations: sessions, admin, contenttypes, todolist, auth
Running migrations:
  Rendering model states... DONE
  Applying todolist.0003_todolist_add_date... OK

修改html文件,加入时间显示【todolist.html】

<div class="text_holder">
    {{ todolist_list.body }} --- {{todolist_list.add_date }}
    <div class="btn-group pull-right">
        <button class="delete btn btn-warning" data-id="{{ todolist_list.id }}">Delete</button>
        <button class="edit btn btn-success" data-id="{{ todolist_list.id }}">Edit</button>
    </div>
</div>

创建poll_filter.py文件并使用

使用if和else实现【poll_filter_old.py】

# coding: utf-8
# author: spareribs

from django import template
import time
import datetime
from dateutil.relativedelta import relativedelta

register = template.Library()


# 将 datetime obj 转换成 timestamp
def date_to_timestamp(date_time):
    return time.mktime(date_time.timetuple())


def time_before():
    timestamp_before = {
        # 1分钟前的时间戳
        'a_minute_before': '',
        # 1小时前的时间戳
        'a_hour_before': '',
        # 1天前的时间戳
        'a_day_before': '',
        # 1周前的时间戳
        'a_week_before': '',
        # 1个月的时间戳
        'a_month_before': '',
        # 1年的时间戳
        'a_year_before': '',
    }
    # 获取当前时间
    now = datetime.datetime.now()
    # 得到1个分钟前的时间(datetim obj)
    timestamp_before['a_minute_before'] = now + relativedelta(minutes=-1)
    # 得到1个小时前的时间(datetim obj)
    timestamp_before['a_hour_before'] = now + relativedelta(hours=-1)
    # 得到1天前的时间(datetim obj)
    timestamp_before['a_day_before'] = now + relativedelta(days=-1)
    # 得到1周前的时间(datetim obj)
    timestamp_before['a_week_before'] = now + relativedelta(weeks=-1)
    # 得到1个月前的时间(datetim obj)
    timestamp_before['a_month_before'] = now + relativedelta(months=-1)
    # 得到1年前的时间(datetim obj)
    timestamp_before['a_year_before'] = now + relativedelta(years=-1)
    # 将datetim obj转换成 timestamp
    for time_tag in timestamp_before:
        timestamp_before[time_tag] = date_to_timestamp(timestamp_before[time_tag])
    return timestamp_before


@register.filter()
def format_date(value):
    before = time_before()
    add_date = date_to_timestamp(value)
    if before['a_minute_before'] < add_date:
        print(before['a_minute_before'], add_date)
        time_ = int(61 - (add_date - before['a_minute_before']))
        return "{0}秒前发布".format(time_)

    elif before['a_hour_before'] < add_date:
        print(before['a_hour_before'], add_date)
        time_ = int(61 - (add_date - before['a_hour_before']) / 60)
        return "{0}分钟前发布".format(time_)

    elif before['a_day_before'] < add_date:
        print(before['a_day_before'], add_date)
        time_ = int(25 - (add_date - before['a_day_before']) / 3600)
        return "{0}小时前发布".format(time_)

    elif before['a_week_before'] < add_date:
        print(before['a_week_before'], add_date)
        time_ = int(8 - (add_date - before['a_week_before']) / 86400)
        return "{0}天前发布".format(time_)

    elif before['a_month_before'] < add_date:
        print(before['a_month_before'], add_date, before['a_month_before'])
        time_ = int(5 - (add_date - before['a_month_before']) / 604800)
        return "{0}周前发布".format(time_)

    elif before['a_year_before'] < add_date:
        print(before['a_year_before'], add_date)
        time_ = int(13 - (add_date - before['a_year_before']) / 2592000)
        return "{0}个月前发布".format(time_)
    else:
        print(before, add_date)
        return "1年前发布"

更简单的方法实现【poll_filter.py】

# coding: utf-8
# author: spareribs
from django import template
import datetime

register = template.Library()

@register.filter()
def time_before(d):
    chunks = (
        (60 * 60 * 24 * 365, u'年'),
        (60 * 60 * 24 * 30, u'月'),
        (60 * 60 * 24 * 7, u'周'),
        (60 * 60 * 24, u'天'),
        (60 * 60, u'小时'),
        (60, u'分钟'),
        (1, u'秒'),
    )

    # 如果不是datetime类型转换后与datetime比较
    if not isinstance(d, datetime.datetime):
        d = datetime.datetime(d.year, d.month, d.day)
    now = datetime.datetime.now()
    delta = now - d
    print(delta)
    # 忽略毫秒
    before = delta.days * 24 * 60 * 60 + delta.seconds
    # 刚刚过去的1分钟
    if before <= 3:
        return u'刚刚'
    for seconds, unit in chunks:
        count = before // seconds
        if count != 0:
            break
    return str(count) + str(unit) + u"前发布"

修改前端,格式化时间

主要的内容如下【todolist.html】

{% load poll_filter %}

{{ todolist_list.body }} --- {{ todolist_list.add_date | time_before }}

遇到的问题

遇到数据库存储时间对应不上的问题

修改了配置文件这两个参数

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
# USE_TZ = True
USE_TZ = False

中间件HttpResponse问题

本来想在中间件加个重定向的HttpResponseRedirect,发现不能用。
HttpResponse不会再执行其他任何中间件
其实这个应该在前端使用js来判断更为合适

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • Refer to: www.threemeal.com/blog/12/ 中间件 中间件是一个钩子框架,它们可以介...
    兰山小亭阅读 16,466评论 9 165
  • (一)、启动服务器 (二)、创建数据库表 或 更改数据库表或字段 Django 1.7.1及以上 用以下命令 1....
    夏天夏星阅读 5,625评论 0 17
  • 经过对django的初步学习,我们已经对后台的基本流程以及django的运作有了一定的了解,但是这还不足够,dja...
    coder_ben阅读 3,821评论 8 34
  • 此段内容简要来自自强学堂的教程详情请查询自强学堂 一、 后台的运作流程 接收request请求 处理数据 获取请求...
    coder_ben阅读 5,243评论 6 56
  • 好多人在写2014年总结,我也想写,但动笔之前忽然就想起来——我在2014年本来是打算写一个名为《十年》的职场总结...
    花8阅读 427评论 0 1