到现在为止我们已经完成的差不多了,并且基本的东西都已经学到了,是时候用起来了。 我们的博客还有很多功能需要完善,下面抛砖引玉新增几个功能,还有其他功能等你自己去发现和实现。

草稿箱

之前我们新建文章的时候只是是保存到数据库,也就是仅仅保存了草稿,还没有对外发布, 在博客首页上面是看不到的,因为published_date字段为空。这里我们需要添加一个草稿箱的链接。还是四部曲。

第一步,添加一个链接:

打开mysite/templates/mysite/base.html文件,在

  1. 1
  1. <h1><a href="/">Django Girls Blog</a></h1>

的上面一行添加如下链接:

  1. 1
    2
  1. <a href="{% url 'post_draft_list' %}" class="top-menu">
    <span class="glyphicon glyphicon-edit"></span></a>

第二步就是配置urls,在blog/urls.py中添加:

  1. 1
  1. url(r'^drafts/$', views.post_draft_list, name='post_draft_list'),

第三步在blog/views.py中添加一个view:

  1. 1
    2
    3
  1. def post_draft_list(request):
    posts = Post.objects.filter(published_date__isnull=True).order_by('-created_date')
    return render(request, 'blog/post_draft_list.html', {'posts': posts})

第四步添加一个template,新建blog/templates/blog/post_draft_list.html,内容如下:

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
  1. {% extends 'blog/base.html' %}
    {% block content %}
    {% for post in posts %}
    <div class="post">
    <p class="date">created: {{ post.created_date|date:'d-m-Y' }}</p>
    <h1><a href="{% url 'blog.views.post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
    <p>{{ post.text|truncatechars:200 }}</p>
    </div>
    {% endfor %}
    {% endblock %}

这个模板跟我们的post_list.html非常相似。

刷新首页,点击那个草稿箱链接,看看效果。

发布功能

在文章详情页面添加一个发布的按钮,如果觉得合适的时候就能发布文章了。 每个新功能都是四部曲,你照着这四步做就行,你会发现越来越简单。

第一步在页面上添加一个链接或Form表单,这里我们添加一个链接。

打开blog/template/blog/post_detail.html,将下面这段

  1. {% if post.published_date %}
    {{ post.published_date }}
    {% endif %}

换成下面这段:

  1. 1
    2
    3
    4
    5
  1. {% if post.published_date %}
    {{ post.published_date }}
    {% else %}
    <a class="btn btn-default" href="{% url 'blog.views.post_publish' pk=post.pk %}">Publish</a>
    {% endif %}

这里增加了一个else语句,意思是如果没有发布日期的话就增加一个发布按钮。

第二步添加urls配置,打开blog/urls.py:

  1. 1
  1. url(r'^post/(?P<pk>[0-9]+)/publish/$', views.post_publish, name='post_publish'),

第三步视图,打开blog/views.py:

  1. 1
    2
    3
    4
  1. def post_publish(request, pk):
    post = get_object_or_404(Post, pk=pk)
    post.publish()
    return redirect('blog.views.post_detail', pk=pk)

第四步模板,由于这次没有引入新的模板,所以这步省略。

刷新后看效果:

发布之后的效果:

注意观察发布前和发布后文章的发布日期那个位置的变化。并且发布后再去首页看看,文章已经可以正常显示了。

删除功能

最后当然需要一个删除功能了。

第一步是在页面上添加链接,打开blog/templates/blog/post_detail.html,在编辑按钮下面一行添加如下:

  1. 1
    2
  1. <a class="btn btn-default" href="{% url 'post_remove' pk=post.pk %}">
    <span class="glyphicon glyphicon-remove"></span></a>

第二步配置urls映射,打开blog/urls.py,添加如下一行:

  1. 1
  1. url(r'^post/(?P<pk>[0-9]+)/remove/$', views.post_remove, name='post_remove'),

第三步添加视图view,打开blog/views.py,添加一个视图函数:

  1. 1
    2
    3
    4
  1. def post_remove(request, pk):
    post = get_object_or_404(Post, pk=pk)
    post.delete()
    return redirect('blog.views.post_list')

第四步模板,由于这次又没有新的模板,所有这步省略。

OK,刷新页面看效果:

删除后再去首页看,已经没有这篇文章了。

分页功能

在首页显示文章列表时候需要分页显示,这时候可以使用django内置的Paginator来分页

关于分页的官方文档:https://docs.djangoproject.com/en/1.9/topics/pagination/

设置非常简单,简直是简单到变态。

在view里面使用Paginator

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
  1. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  2.  
  3. def post_list(request):
    """所有已发布文章"""
    postsAll = Post.objects.annotate(num_comment=Count('comment')).filter(
    published_date__isnull=False).prefetch_related(
    'category').prefetch_related('tags').order_by('-published_date')
    for p in postsAll:
    p.click = cache_manager.get_click(p)
    paginator = Paginator(postsAll, 10) # Show 10 contacts per page
    page = request.GET.get('page')
    try:
    posts = paginator.page(page)
    except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    posts = paginator.page(1)
    except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    posts = paginator.page(paginator.num_pages)
    return render(request, 'blog/post_list.html', {'posts': posts, 'page': True})

这里我传到页面去的posts是一个Page对象,另外我还传了一个”page”标志,因为其他方法也会使用到这个页面,但是不需要分页的。

修改post_list.html页面,增加分页div

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
  1. {% for post in posts %}
    ...这个中间是对于文章post的循环,这个不变...
    {% endfor %}
    {% if page %}
    <div class="pagination">
    <span class="step-links">
    {% if posts.has_previous %}
    <a href="?page={{ posts.previous_page_number }}">previous</a>
    {% endif %}
    <span class="current">
    Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
    </span>
    {% if posts.has_next %}
    <a href="?page={{ posts.next_page_number }}">next</a>
    {% endif %}
    </span>
    </div>
    {% endif %}

刷新下列表首页,看看分页效果。

Django1.9开发博客(8)- 继续完善的更多相关文章

  1. Django1.7开发博客

    转自: http://www.pycoding.com/articles/category/django 基于最新的django1.7写的,通俗易懂,非常适合新手入门. 感谢博主! 参考教程: htt ...

  2. Django1.9开发博客(14)- 集成Xadmin

    xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 B ...

  3. Django1.9开发博客(7)- 实现功能

    到目前为止我们已经完成了一个django应用的所有基础部分. 包括url配置.视图.模型和模板.接下来开始继续完善我们的博客系统了. 首先我们需要一个显示每篇文章的详细页面,对不? 文章详情 对于首页 ...

  4. Django1.9开发博客(12)- i18n国际化

    国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指 ...

  5. Django1.9开发博客(11)- 富文本与代码高亮

    TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,支持目前流行的各种浏览器,由JavaScript写成. 功能配置灵活简单(两行代码就可以将编辑器嵌入网页中),支持AJAX.另一特点是加载速度 ...

  6. Django1.9开发博客(13)- redis缓存

    Redis 是一个高性能的key-value数据库.redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用. 它提供了Pyth ...

  7. Django1.9开发博客(10)- 全文搜索

    Django本身不提供全文检索的功能,但django-haystack为其提供了全文检索的框架. django-haystack能为Django提供whoosh,solr,Xapian和Elastic ...

  8. Django1.9开发博客(9)- 用户认证

    你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post ...

  9. Django1.9开发博客(6)- 模板继承

    模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容.通过这种方式你就需要在每个页面复制粘贴同样的代码了. 如果你想改变页面某个公共部分,你不需要每个页面的去修改,只需要修改一 ...

随机推荐

  1. LUA实现单词替换功能

    背景描述 编程或者文档处理过程, 经常遇到需要将一个单词修改为另外一个单词的情况, 例如 命名为 shall 修改 为 should. 使用工具实现, 则比较方便,不容易出错, 解放双手. 需求规格 ...

  2. DuiLib学习笔记2——写一个简单的程序

    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...

  3. oracle生成主键

    SELECT 'ZTO'||TO_CHAR(SYSDATE,'yymmdd')||TO_CHAR(SEQ_COMMON_ORDER.NEXTVAL,'FM00000000') AS orderCode ...

  4. DNS协议

    DNS Message: Header   消息头部 Question    DNS请求 Answer  回答请求的资源记录(Resource Record(s)) Authority   指向域的资 ...

  5. 《30天自制操作系统》14_day_学习笔记

    harib11a--harib11c: 继续测试性能:我们在harib10h中进行了定时链表结构的改进“消除了移位处理”.下面我们设定490个定时器(它们都被设定启动50天才超时)来测试一下改进的效果 ...

  6. SVN----------项目服务器上的svn客户端自动更新设置。

    1.局域网服务器上搭建了PHP项目运行的环境,然后怎么样讲根目录拉去到的项目可以随着开发人员提交的代码,自动更新成最新的代码. 2.首先将svn版本库上的代码拉取到www目录下或者你的根目录. 3.然 ...

  7. jQuery对select操作小结

    //遍历option和添加.移除optionfunction changeShipMethod(shipping){ var len = $("select[@name=ISHIPTYPE] ...

  8. windows环境下Django安装配置

    --python下载 https://www.python.org/downloads/ --pip 下载 https://pypi.python.org/pypi/pip --pip 安装及路径 解 ...

  9. SQL2005中的事务与锁定(三)- 转载

    ------------------------------------------------------------------------ -- Author : HappyFlyStone  ...

  10. 20145227&20145201 《信息安全系统设计基础》实验一 开发环境的熟悉

    北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级:1452 姓名:李子璇 鄢曼君 学号:20145201 20145227 成绩: 指导教师:娄嘉鹏 实验日期:2016 ...