Django 博客教程笔记(二)

分页使用

# views.py
article_list = Article.objects.all() 
paginator = Paginator(article_list, 10) // 创建分页对象
try:
    page = int(request.Get.get('page',1))
    article_list = paginator.page(page) // 获得当前页数据
except (EmptyPage, InvalidPage, PageNotAnInterger) :
    article_list = paginator.page(1)
#
# 模板中
for tag in article.tag.all // 多对多
for comment in article.comment_set.all // 一对多
article.publisher_date | date:'Y-m-d'
#
# 模板中分页
<div id="pagination">
    <ul id="pagination-flickr">
    {% if article_list.has_previous %}
    <li class="previous"><a href="?page={{ article_list.previous_page_number }}{% if request.GET.year %}&year={{ request.GET.year }}{% endif %}{% if request.GET.month %}&month={{ request.GET.month }}{% endif %}{% if request.GET.cid %}&cid={{ request.GET.cid }}{% endif %}">«上一页</a></li>
    {% else %}
    <li class="previous-off">«上一页</li>
    {% endif %}
     <li class="active">{{ article_list.number }}/{{ article_list.paginator.num_pages }}</li>
    {% if article_list.has_next %}
      <li class="next"><a href="?page={{ article_list.next_page_number }}{% if request.GET.year %}&year={{ request.GET.year }}{% endif %}{% if request.GET.month %}&month={{ request.GET.month }}{% endif %}{% if request.GET.cid %}&cid={{ request.GET.cid }}{% endif %}">下一页 »</a></li>
    {% else %}
      <li class="next-off">下一页 »</li>
    {% endif %}
   </ul>
</div>

自定义 manger 管理器

对于 select date_format() 这种 sql 语句只能通过 raw 或者 execute 方式
但是 raw  的 % 要用 %% 转义,同时 raw 必须包含主键
更优雅的方式是:自定义 manager 管理器:
# models.py
class ArticleManager(models.Manager):
    # 新增一个数据处理的方法,此处为此方式
    # 改变原有的 queryset
    def distinct_data(self):
        distinct_data_list = []
        datas = self.values('publisher_date')
        for data in datas:
            date = data['publisher_date'].strftime('%Y-%m docs')
            if date not in distinct_data_list:
                distinct_data_list.append(date)
        return distinct_data_list

class Article(models.Model):
    objects = ArticleManager()
#
# views.py
print(Article.objects.distinct_data()
# index.html
{{ archive|slice:':4' }}
# views.py
year = request.GET.get('year')
month = request.GET.get('month')
Article.objects.filter(publisher_date__icontains=year+'-'+month)
# archive.html
{{ request.GET.year }}

重构

  • 把 category_list 和 archive_list 放到了 global_settings()
  • 重构 page : getPage(request, article_list) , include 'pagination.html'
  • pagination.html 中 加入分页参数的判断
  • 评论排行
# 
comment_list = Comment.objects.values('articles').annotate(c_count=Count('article')).order_by('-c_count')
# 
article_list = [Article.objects.get(pk=comment['article']) for comment in comment_list]
  • global_settings() 函数中 return locals()

自定义过滤器

# app 目录下创建 templatetags 文件夹 ,myfilter.py 文件
# -*- 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)
#
# 
{% load myfilter %}

评论

# 获取评论信息
        comments = Comment.objects.filter(article=article).order_by('id')
        comment_list = []
        for comment in comments:
            for item in comment_list:
                if not hasattr(item, 'children_comment'):
                    setattr(item, 'children_comment', [])
                if comment.pid == item:
                    item.children_comment.append(comment)
                    break
            if comment.pid is None:
                comment_list.append(comment)

# forms.py 中评论表单
class CommentForm(forms.Form):
    '''
    评论表单
    '''
    author = forms.CharField(widget=forms.TextInput(attrs={"id": "author", "class": "comment_input",
                                                           "required": "required","size": "25", "tabindex": "1"}),
                              max_length=50,error_messages={"required":"username不能为空",})
# views.py 中评论表单
        comment_form = CommentForm({'author': request.user.username,
                                    'email': request.user.email,
                                    'url': request.user.url,
                                    'article': id} if request.user.is_authenticated() else{'article': id})
# article.html
{{ comment_form.author }}
# views.py
if comment_form.is_valid()
Comment.objects.create()
#
# 绕过 csrf_token
@csrf_exemp

注册,登录,注销

  • 注册
class RegForm(forms.Form):
    '''
    注册表单
    '''
    username = forms.CharField(widget=forms.TextInput(attrs={"placeholder": "Username", "required": "required",}),
                              max_length=50,error_messages={"required": "username不能为空",})
# 获取表单对象
reg_form = RegForm(request.POST)
# 模板页面
{{ reg_form.username }}
# 获取来源页
<input type="hidden" name="source_url" value="{{ request.META.HTTP_REFERER }}">
# do_reg
password=make_password(reg_form.cleaned_data["password"]),)
  • 登录
user.backend = 'django.contrib.auth.backends.ModelBackend' # 指定默认的登录验证方式 
# 验证用户
user = authenticate(username=username, password=password)
login(request, user)                
return redirect(request.POST.get('source_url'))
  • 注销
logout(request)
  • 判断是否登录
request.user.is_authenticated()
#  模板中
{% if not request.user.is_authenticated %}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容