Django1.9开发博客(8)- 继续完善

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

草稿箱

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

第一步,添加一个链接:

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

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

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

12
<a href="{% url ‘post_draft_list‘ %}" class="top-menu"><span class="glyphicon glyphicon-edit"></span></a>

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

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

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

123
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,内容如下:

12345678910
{% 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,将下面这段

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

换成下面这段:

12345
{% 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
url(r‘^post/(?P<pk>[0-9]+)/publish/$‘, views.post_publish, name=‘post_publish‘),

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

1234
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,在编辑按钮下面一行添加如下:

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

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

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

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

1234
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

1234567891011121314151617181920
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

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

123456789101112131415161718
{% 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 %}

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

时间: 2024-10-12 15:40:47

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

Django1.7开发博客

转自: http://www.pycoding.com/articles/category/django 基于最新的django1.7写的,通俗易懂,非常适合新手入门. 感谢博主! 参考教程: http://tutorial.djangogirls.org/ GitHub项目地址: https://github.com/yidao620c/simpleblog Heroku演示地址: https://yidaoblog.herokuapp.com/   教程目录: 使用Django1.7开发博客

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

xadmin是一个django的管理后台实现,使用了更加灵活的架构设计及Bootstrap UI框架, 目的是替换现有的admin,国人开发,有许多新的特性: 兼容 Django Admin 使用 Bootstrap 作为 UI 框架 编辑页面灵活布局 主页面仪表盘及小部件 过滤器强化 数据导出 强大的插件机制 与django的集成 本篇以simpleblog项目为例,介绍下怎样在django中集成xadmin python2.7环境切换 注意,前面的教程都是在python3.4环境下开放的.

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

国际化与本地化的目的为了能为各个不同的用户以他们最熟悉的语言和格式来显示网页. Django能完美支持文本翻译.日期时间和数字的格式化.时区. 另外,Django还有两点优势: 允许开发者和模板作者指定他们哪些app应该被翻译或被格式化为本地形式. 允许用户根据自己的偏好来实现本地化显示.翻译依据语言,格式化依据国家, 这些信息由浏览器中的Accept-Language头来决定.不过目前为止时区还未能实现. 参考官方文档:https://docs.djangoproject.com/en/1.9

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

TinyMCE是一个轻量级的基于浏览器的所见即所得编辑器,支持目前流行的各种浏览器,由JavaScript写成. 功能配置灵活简单(两行代码就可以将编辑器嵌入网页中),支持AJAX.另一特点是加载速度非常快. django里引用TinyMCE富文本编辑器,其实很简单,前提是你知道django的静态文件配置. 其实这个我已经在前面文章提到过,可以回去再看看. TinyMCE的官方网站是:http://www.tinymce.com/ 下载地址:http://download.moxiecode.c

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

Redis 是一个高性能的key-value数据库.redis的出现, 很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用. 它提供了Python,Ruby,Erlang,PHP客户端,使用很方便. 目前Redis已经发布了3.0版本,正式支持分布式,这个特性太强大,以至于你再不用就对不住自己了. 性能测试 服务器配置:Linux 2.6, Xeon X3320 2.5Ghz SET操作每秒钟110000次,GET操作每秒钟81000次

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

Django本身不提供全文检索的功能,但django-haystack为其提供了全文检索的框架. django-haystack能为Django提供whoosh,solr,Xapian和Elasticsearc四种全文检索引擎作为后端. 其中whoosh为纯python的实现,不是非常大型的应用,是没有问题的. 本文将介绍Django1.9中通过django-haystack与whoosh集成以及whoosh的中文支持. 安装依赖: pip install django-haystackpip

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

你应该注意到了一点,当你去新建.修改和删除文章的时候并不需要登录,这样的话任何浏览网站的用户都能随时修改和删除我的文章.这个可不是我想要的! 编辑和删除的认证 我们需要保护post_new, post_edit和post_publish这三个视图,只有登录用户才有权去执行. django为我们提供了很好的帮助类,其实就是利用了python中的decorators技术. django中认证的装饰器位于模块django.contrib.auth.decorators中,名称叫login_requir

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

模板继承就是网站的多个页面可以共享同一个页面布局或者是页面的某几个部分的内容.通过这种方式你就需要在每个页面复制粘贴同样的代码了. 如果你想改变页面某个公共部分,你不需要每个页面的去修改,只需要修改一个模板就行了,这样最大化复用,减少了冗余,也减少了出错的几率,而且你敲的代码也少了. 创建一个base模板 一个base模板就是你全站所有页面都会继承的最基本的网站框架模板.我们在blog/templates/blog/中创建一个base.html模板: blog └───templates └──

文顶顶iOS开发博客链接整理及部分项目源代码下载

文顶顶iOS开发博客链接整理及部分项目源代码下载 网上的iOS开发的教程很多,但是像cnblogs博主文顶顶的博客这样内容图文并茂,代码齐全,示例经典,原理也有阐述,覆盖面宽广,自成系统的系列教程却很难找.如果你是初学者,在学习了斯坦福iOS7公开课和跟着文顶顶的博客做项目之后,最快只需要2个月时间,就基本可以独立完成iOS App的开发工作.有经验的开发者也可以在该博客中寻找代码片段进行学习借鉴,必有所收获. 在此也向@文顶顶 表示严重感谢! 由于文顶顶博客博文繁多,每次找文章需要频繁的翻页,