有了文章列表页面后,当然还需要详情页面,方便用户对某一篇感兴趣的文章深入阅读。 编写视图函数打开article/views.py,增加文章详情页面的视图函数article_detail(): article/views.py ... # 文章详情 def article_detail(request, id): # 取出相应的文章 article = ArticlePost.objects.get(id=id) # 需要传递给模板的对象 context = { 'article': a…
标签详情
django 分类
上一章我们实现了文章详情页面。为了让文章正文能够进行标题、加粗、引用、代码块等不同的排版(像在Office中那样!),我们将使用Markdown语法。 安装MarkdownMarkdown是一种轻量级的标记语言,它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的或者HTML文档。建议读者一定要花五分钟时间熟悉一下Markdown的语法,熟练后码字效率一定会大幅提高。 关于Markdown语法看这里:Markdown 语法介绍 安装markdown也很简单:进入虚拟环境,输入指令pip…
Django 框架主要关注的是模型(Model)、模板(Template)和视图(Views),称为MTV模式。 它们各自的职责如下: 层次 职责 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。 模板(Template),即业务逻辑层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。 视图(View),即表现层 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。 简单来说就是Model存取数据,View决定…
前面我们已经学会如何用Markdown语法书写文章了。 但是还有问题呀。之前写文章都是在后台中进行的,万一有别的普通用户也要发表文章怎么办?万一我想拓展些后台中没有的提交验证功能又怎么办? 本章即讲述如何在前台中提交新的文章,以便满足开发者各种各样的特殊需求。 Forms表单类在HTML中,表单是在 <form>...</form> 中的一些元素,它允许访客做类似输入文本、选择选项、操作对象或空间等动作,然后发送这些信息到服务端。一些表单界面元素(文本框或复选框)非常简单并内置在HTML中,而其…
目前为止我们已经完成了文章的新建、删除以及查看,还剩最后一项,即对已经完成的文章进行修改。 实际上修改文章与新建文章有点类似,不同的地方有两点: 修改是在原有文章的基础上,因此需要传递 id 指明具体需要修改的文章 加载页面时需要将旧的内容作为默认值填写到表单中,因此需要将文章对象传递到html中 按照这个思路,接下来先写视图函数。 视图函数在ariticle/views.py中增加修改文章的视图函数article_update(): article/views.py ... # 更新文章 de…
既然有登录登出,那么用户的注册肯定也是少不了的。 注册表单类用户注册时会用到表单来提交账号、密码等数据,所以需要写注册用的表单/userprofile/forms.py: /userprofile/forms.py ... # 注册用户表单 class UserRegisterForm(forms.ModelForm): # 复写 User 的密码 password = forms.CharField() password2 = forms.CharField() class Meta: mod…
这一章将实现删除用户数据的功能。实际上删除用户和前面的删除文章是完全类似的,有了之前的铺垫,这一章会非常的轻松。 权限与视图用户数据是很多网站最重要的财产,确保用户数据的安全是非常重要的。 前面学习的用户登录、退出、创建都是相对安全的操作;而删除数据就很危险,弄不好会造成不可逆的损失。因此我们希望对操作者做一些限制,比如只能用户登录且必须是本用户才能进行删除的操作。这就是权限。 因此在视图中进行简单的用户权限的验证工作。编写/userprofile/views.py: /userprofile/…
随着技术的发展,验证用户身份的手段越来越多,指纹、面容、声纹应有尽有,但密码依然是最重要的手段。 互联网处处都有密码的身影,甚至变成了现代人的一种负担。像笔者这样的,动辄几十个账号密码,忘记其中几个简直太正常了。 本章讲如何帮助健忘症患者,重置用户密码。 安装第三方库前面我们已经知道如何修改文章标题、正文等内容,但是密码作为验证身份的重要口令,必须以更加稳妥的方式修改。一种比较常用的方式是发送一封修改密码的邮件到用户事先绑定的邮箱里。 业务流程分析如下: 向用户邮箱发送包含重置密码地址的邮件。邮…
随着时间的推移(加上勤奋的写作!),你的博客文章一定会越来越多。如果不进行处理,可能同一个页面会挤上成百上千的文章,不美观不说,还降低了页面的反应速度。 这个时候就需要对文章进行分页的处理。 利用轮子写一个完善的分页功能是有些难度的,好在Django已经帮你准备好一个现成的分页模块了(Django把大部分基础功能都替你准备好了!)。内置模块虽然简单,但是对博客来说完全足够了。 我们要用到的是Paginator类。在Shell中可以充分尝试它的用法: >>> from django.core.pa…
到目前为止我们的博客处理的都是文字。现代互联网早就进入了“读图”时代,图片的维护、展示也就相当重要。 上一章中预留了avatar字段,用来保存用户上传的头像,现在我们来实现这个功能。 必要的设置图片属于一种媒体文件,它与静态文件类似,需要设置一个统一的目录,便于集中存储和访问。 这类需要框架统一设置的参数,当然应该在/my_blog/settings.py中。在底部加上: /my_blog/settings.py ... # 媒体文件地址 MEDIA_URL = '/media/' MEDIA_…
文章浏览量是所有社交类网站所必备的数据,足以显示其重要性了。 博主可以通过浏览量来评估某篇文章的受欢迎程度,读者也能够通过浏览量来筛选质量更高的文章。 然而,准确统计浏览量并不简单: 某些类型的请求不应该统计为浏览量,比如作者自己的浏览或编辑文章之后的重定向请求; 由于用户众多,浏览量的数据时刻都在快速更新,会给数据库带来很大的压力。因此很多大型网站都会使用如Redis这样的读写速度非常快的内存数据库辅助存储。 因为我们的项目是博客网站,粗略统计就可以了,也没有那么大的用户压力,所以设计就简单得…
有了浏览量之后,文章受欢迎的程度就有了评价标准。随之而来的就有根据浏览量对文章进行排序的需求,即显示**“最热文章”**。 现在你已经很熟悉MTV模式,不需要我啰嗦也能完成任务: 文章的模型已经有了,不需要写Model了 写一个视图函数article_list_by_views(),取出按浏览排序后的文章对象 将文章对象传递到模板,并进行渲染 很简单,但也隐藏着问题:最热文章列表和之前的普通文章列表相比,大部分功能其实都是相同的,仅仅是排序不同而已。 万一哪天需要根据文章标题排序呢?万一还需要用…
不管是最新文章列表也好、最热文章列表也罢,都是把所有的文章数据全部展示给了用户。 但是如果用户只关心某些特定类型的文章,抽取全部数据就显得既不方便、又不效率了。 因此,给用户提供一个搜索功能,提供给用户感兴趣的几篇文章,就大有用处了。 准备工作逻辑尽管细节不同,但是搜索和列表有很多类似的地方:它们都是先检索出一些文章对象,并将其展示给用户。上一章已经说过,代码重复是万恶之源,好的实践必须把功能类似的模块尽量复用起来。基于这个原则,我们打算继续在原有的article_list()上添砖加瓦,让其功…
教程看到这里,你已经学会如下内容: 搭建开发环境 博文管理 用户管理 发表评论 若干其他功能 搭建简单的小博客,以上的功能够用了。**但相信你的志向不止于此,**毕竟程序员面试个个造火箭啊。 接下来学什么教程接下来是进阶部分,包括: 类视图 多级评论 文章栏目和标签 图片处理 第三方登录 测试与维护 部署 其他内容 部署开发好项目的demo后,你应该尽快部署到云服务器上,让世界各地的用户随时浏览你的网页。不要误会,部署只是一个起点,作用是让你获得巨大的成就感;部署后你还是需要持续的优化、添加网站…
对会读书的人来说,读一本书要做的第一件事,就是仔细阅读这本书的目录。阅读目录可以对整体内容有所了解,并清楚地知道感兴趣的部分在哪里,提高阅读质量。 博文也是同样的,好的目录对博主和读者都很有帮助。更进一步的是,还可以在目录中设置锚点,点击标题就立即前往该处,非常的方便。 文中的目录之前我们已经为博文支持了Markdown语法,现在继续增强其功能。 有折腾代码高亮的痛苦经历之后,设置Markdown的目录扩展就显得特别轻松了。 修改文章详情视图: article/views.py ... # 文章…
在没有互联网的年代,我们用日记来记录每天的心得体会。小的时候我有一个带锁的日记本,生怕被别人看见里面写了啥,钥匙藏得那叫一个绝。 现在时代变了,网络版的日记本:博客,却巴不得越多人看越好。 别人看完你写的深度好文,难免也想高谈阔论一番,这就是“评论”功能。 本章将要编写的评论模块,几乎没有新的知识点,而是将前面章节内容的综合应用。 强烈建议读者自行尝试编写这部分内容,测试自己的知识掌握程度。 准备工作评论是一个相对独立的功能,因此新建一个评论的app: (env) E:\django_proje…
说是完结,马上又开始写进阶篇了。 本章不会为博客项目增加新功能,但是也同样重要,因为我们要学习高逼格的基于类的视图。 什么是类视图前面章节中写的所有视图都是基于函数的,即def;而类视图是基于类的,即class。 有编程基础的同学都知道,类是面向对象技术中非常重要的概念。具有复杂数据、功能的类,可以通过继承轻而易举的将自身特性传递给另一个类,从而实现代码的高效复用。 相比以前的函数视图,类视图有以下优势: HTTP方法(GET,POST等)相关的代码,可以通过方法而不是条件分支来组织 可以通过诸…
现在虽然博客的功能大都实现了,但是界面还是比较朴素,特别是首页的文章列表几乎全是文字,看多了难免疲劳。因此,给每个文章标题配一张标题图,不仅美观,用户也能通过图片快速了解文章内容。实际上大部分社交网站也都是这么干的,毕竟人的天性就是懒,能看图就坚决不看字。 在上传用户头像章节中,我们已经接触过上传、展示图片了。标题图的实现也差不多,不同的是本章会更近一步,对图片进行缩放等处理,使页面整洁美观、并且高效。 准备工作与用户头像类似,标题图是属于每篇博文自己的“资产”,因此需要修改model,新建一个…
“标签”是作者从文章中提取的核心词汇,其他用户可以通过标签快速了解文章的关注点。每一篇文章的标签可能都不一样,并且还可能拥有多个标签,这是与栏目功能不同的。 好在标签功能也有优秀的三方库:Django-taggit,省得自己动手设计了。快速开发就是这样,能“借用”就不要自己重复劳动。 安装及设置首先在虚拟环境中安装Django-taggit: pip install django-taggit 安装成功后,修改项目设置以添加库: my_blog/settings.py ... INSTALLED…
前面我们已经实现了用Markdown语法写文章了。但是文章的评论用Markdown就不太合适了,你不能强求用户也花时间去熟悉语法啊。另外评论中通常还有表情、带颜色的字体等功能,这些也是Markdown不具备的。 因此富文本编辑器Django-ckeditor就派上用场了。 在后台使用Ckeditor在虚拟环境中安装django-ckeditor: (env) > pip install django-ckeditor 安装成功后还是老规矩,在settings.py中注册app: my_blog/…
博客的文章类型通常不止一种:有时候你会写高深莫测的技术文章,有时候又纯粹只记录一下当天的心情。 因此对文章的分类就显得相当的重要了,既方便博主对文章进行分类归档,也方便用户有针对性的阅读。 而文章分类一个重要的途径就是设置栏目。 栏目的模型实现文章栏目功能的方法有多种。你可以只是简单的在文章的Model中增加CharField()字段,以字符串的形式将栏目名称保存起来(实际上这种实现更像是**“标签”**,以后会讲到)。这样做的优点是比较简单;缺点也很明显,就是时间长了你可能会记混栏目的名字,并…
本章集中介绍四个重要的小功能:回到顶部浮动按钮、矢量图标、页脚沉底和粘性侧边栏。 这几个功能与Django基本没啥关系,更多的是前端知识,但是对博客网站都很重要,问的读者也比较多,因此也集中讲一下好了。 回到顶部浮动按钮当用户拜读完你的博文后,可能想回到文章开头重新阅读,或者审视其中的某些内容。如果文章内容较多,不停滑动滚轮回页面顶部未免有点太让人烦躁了。 一种解决办法是增加一个回到顶部的浮动按钮。当页面向下滚动到某个位置后,按钮就呈现在页面右下角;点击按钮,页面就回到顶部。这个功能 Boots…
凭借你勤奋的写作,拜读你文章的用户越来越多,他们的评论也分散在众多的文章之中。作为博主,读者的留言肯定是要都看的;而读者给你留言,自然也希望得到回复。 怎么将未读的留言呈现给正确的用户呢?总不能用户自己去茫茫文章中寻找吧,那也太蠢了。给评论增加通知功能就是很流行的解决方案:比如微信朋友圈留言的通知、新浪微博留言的通知、以及各种社交平台的“小红点”。 本篇将以django-notifications为基础,非常高效的搭建一个简易的通知系统。 发送通知前面的步骤我们已经很熟悉了。 首先安装djang…
**老读者注意:**上一章消息通知有个bug,即发给管理员的notify必须移动到new_comment.save()的后面,否则会导致action_object存储为NULL,并且导致本章的html拼接锚点失效。 原文已更正,为博主的疏忽表示歉意。 上一章已经实现了消息通知功能,可以很人性化的把用户引导到被他人回复的页面中去。 但是仔细想想,似乎还有不方便的地方:如果页面中评论较多,想找到感兴趣的那一条评论还是要费点功夫的。所以这个消息通知,最好是能够不仅前往正确的页面,还要前往正确的位置(需…
现在我们已经拥有一个可以进行用户本地登录的博客系统了。如果有人欣赏你的文章,说不定就会注册成为本地用户,并和你好好交流一番。 但头疼的是,用户可能每天都在互联网上浏览很多非常棒的博客,如果每个博客都要去注册才能评论,对用户是个不小的负担。对个人博客这类草根网站,说不定用户就懒得去注册了,你也就损失了一个潜在的”粉丝“。 比较流行的解决方案是允许用户通过第三方登录,即可以通过GitHub、微博这类知名社区的授权,从而登录你的小站,免去了注册的麻烦。 本章会介绍一个强大的库:Django-allau…
测试是伴随着开发进行的,开发有多久,测试就要多久。本教程已经进行了30多章了,都是如何测试的?当然是runserver啦!每当开发新功能后,都需要运行服务器,假装自己就是用户,测试是否运行正常。 这样的人工测试优点是非常直观,你看到的和用户看到的是完全相同的。但是缺点也很明显: **效率低。**在开发时可能你需要反复的修改代码、测试功能,这样重复查看几十次甚至几百次网页时会相当的让人烦躁。 **容易遗漏bug。**随着你的项目越来越复杂,组件之间的交互也更加复杂。修改某一个组件可能会导致另一个组…
上一章学习了自动化测试,很好,现在我们可以绞尽脑汁写出一份全面的测试,来保证代码永远健康了。 话虽如此,但是作为一个独立开发者很难写出真正全面的测试代码。这是因为用户在使用你的网站时可不会循规蹈矩,而是会以各种怪异的姿势浏览网页、上传数据。但这也不是坏事,用户就是天然的测试人员,他们会很可爱的帮你找出一大堆的bug,陪你度过难眠的夜晚(伴随着编程能力的提升)。 现在的问题是,开发者如何得知用户到底遇到了哪些问题?用户们大部分都与你素昧平生,分部在世界各地。更糟糕的是,部署在线上时由于配置了DEB…
我们的博客虽然还有很多不完善的地方,但是没关系,越早把它部署到互联网上,才能越早发现线上特有的问题。现在也提倡渐进式开发,让产品在迭代中快速成长。 部署考验的不是你的 Django 编程水平,而是你对 Linux 的操作能力,以及对网络通信的理解。多说无益,直接开干! 配置服务器要架设网站,首先你要有一台连接到互联网的服务器。国内比较出名的云服务器属阿里云、腾讯云、百度云,三家各有优劣,大家自行了解比较,并选择自己适合的购买。 利益相关:博主自己用的是阿里云,所以教程会以阿里云ECS作为例子讲解…
假设你的博客已经顺利部署到了线上。你写了很多好文章,和粉丝们互动并感受成就感。 现在你想更进一步,努力提高文章质量,使其更受读者欢迎,打造圈内一流博客。问题是该如何判断一篇文章是“受欢迎的”?靠浏览量是个方法,但是并不能区分出内容花拳绣腿的标题党。靠评论数也是个好方法,但个人博客通常读者不多,好文章零评论是很正常的。 这时候**“点赞”**功能就显得重要了。如果大部分读者都给了一个赞,那就表明文章确实还不错。 动手之前的思考点赞功能可不简单,实现途径非常的多。别急着动手,耐心思考:我们的博客到底…
本教程共写作了一年多(龟速更新..),也算告一段落了。如果还有读者特别想看、但是教程又没涉及的内容,博主会继续更新,不过时间就不能保证了。业余精力有限,如果不能保证文章的质量,那我情愿不写。 如果你是本教程的忠实读者,看到这里就已经学会了以下内容: 博文管理 用户管理 多级评论 文章栏目和标签 图片处理 第三方登录 点赞 测试与维护 部署 其他零星功能 不错,基本功能都有了。 接下来学什么响应式布局响应式布局,简单来说就是页面布局随着终端设备的变化而自动适应。 教程为了起步平缓,没有展开这方面的…