Wolf从零学编程-用Django撸个Blog(七)
来源:互联网 发布:户外六只脚软件下载 编辑:程序博客网 时间:2024/05/16 09:00
这一篇记录了学习模板的过程,以及对之前编写内容的一些改进。
模板学习
我个人模板学习的流程:
- 迅速把html、CSS、JS的基础知识读了一遍,了解怎么查阅W3Cschool和自强学堂的参考手册。
- 上网找一个自己喜欢的模板,然后开始看代码,不懂的地方查阅参考手册
- 创建一个base.html,再适当修改,把模板改造成自己的
学习完毕!本模板来自模板之家
改进
文章列表顺序
我的文章列表是按发布时间排列的,这应该是不太合理的,进入博客后,首先看到的应当是最新发布的,因此要改成按发布时间逆序排列。
这就比较简单了,在取出文章列表的代码上添加了排序就可以。
# views.pyclass IndexView(ListView): ... #重写get_queryset方法,只显示已发布的文章 def get_queryset(self): article_list = Article.objects.filter(status='published')**.order_by('-created_time')** return article_list ...class CategoryView(ListView): ... #重写get_queryset方法,从已发布的文章中按分类筛选 def get_queryset(self): article_list = Article.objects.filter(category=self.kwargs['category_id'],status='published')**.order_by('-created_time')** return article_list ...#和CategoryView完全一样 class TagView(ListView): ... #重写get_queryset方法,从已发布的文章中按标签筛选 def get_queryset(self): article_list = Article.objects.filter(tag=self.kwargs['tag_id'],status='published')**.order_by('-created_time')** return article_list
如此即可,所有会显示文章列表的页面都是逆序排列了。
刚巧到这里,想到评论也应该是逆序的~~
# views.pyclass ArticleView(DetailView): ... #把评论form添加到context def get_context_data(self,**kwargs): kwargs['comment_list'] = self.object.comment_set.all()**.order_by('-created_time')** kwargs['form'] = CommentForm()
上一张目前的截图:
首页只显示最近5篇
一般在博客首页只会显示最近发布的几篇文章,而分类文章列表是所有文章,所以要在首页视图中添加一个切片。
# views.pyclass IndexView(ListView): ... #重写get_queryset方法,只显示已发布的文章 def get_queryset(self): article_list = Article.objects.filter(status='published').order_by('-created_time')**[:5]** return article_list ...
添加Search功能
博客的内容会不断积累,为了方便快速找到目标文章,搜索功能是必不可少的。
简单的搜索应该有一个输入框和一个提交按钮,若输入有效则执行搜索,并将搜索结果返回。
开始的想法是:
- 搜索视图也用通用视图实现
- 搜索框放在如上图右上角的位置,任意页面都可以直接输入搜索内容
但是两个要求暂时都不会实现,本着先上线再迭代的原则,退而求其次,添加一个搜索按钮,点击后进入搜索页,视图函数自己编。
URLconf直接添加:
# urls.pyurlpatterns = [ ... url(r'^search/$',views.search,name='search'),]
视图函数中,对输入内容进行简单的验证,然后将分类列表、标签列表、文章列表和错误渲染到搜索页中。
# views.pydef search(request): category_list = Category.objects.all().order_by('category') tag_list = Tag.objects.all().order_by('tag') errors=[] #先自带隐藏错误,如果是地址栏输入search进入,直接跳到最后的return #若用户点击search则执行下列代码 if 'q' in request.GET: q=request.GET['q'] if not q: errors.append('请输入搜索内容。') elif len(q)>20: errors.append('最多只能搜索长度20的内容。') else: article_list=Article.objects.filter(title__contains=q,status='published').order_by('-created_time') return render(request,'blog/search_form.html',{'article_list':article_list,'category_list':category_list,'tag_list':tag_list,'query':q}) return render(request,'blog/search_form.html',{'category_list':category_list,'tag_list':tag_list,'errors':errors})
改变页面标题
目前所有页面显示的标题都是一样的,这显然是不合理的,标题应该随着内容而变化,比如我进行搜索时,标题应该是’搜索’,因此在base.html中把title部分变为可覆盖,写成<title>{% block title %}Wolf's House{% endblock %}</title>
,然后在每个模板中用相应的标题覆盖就可以了,不覆盖就会显示默认值”Wolf’s House”。
搜索页单独使用一个模板,只需要在html中将标题写成’搜索’就可以了,但首页、分类和标签我共用了一个模板,因此必须在视图函数中获取正确的title。
# views.pyclass CategoryView(ListView): ... #重写,返回分类和标签列表 def get_context_data(self,**kwargs): kwargs['category_list'] = Category.objects.all().order_by('category') kwargs['tag_list'] = Tag.objects.all().order_by('tag') **kwargs['title'] = '分类目录:%s' % Category.objects.filter(id=self.kwargs['category_id'])[0].category** return super(CategoryView,self).get_context_data(**kwargs)
添加一行代码,获取title后渲染模板,标题就正确的显示了。”Category.objects.filter(id=self.kwargs[‘category_id’])”得到的是一个相应ID号的列表,只有一个元素,用列表切片得到这个元素后,元素的category属性就是我需要的那个分类名称。
模板部分我只是修改了网上的模板,就不贴了,目前页面是这样的:
感觉凑乎了,今天把代码上传到我的github仓库,以后慢慢迭代吧。
容我自大一次,该学习服务器部署了。
- Wolf从零学编程-用Django撸个Blog(七)
- Wolf从零学编程-用Django撸个Blog(一)
- Wolf从零学编程-用Django撸个Blog(二)
- Wolf从零学编程-用Django撸个Blog(三)
- Wolf从零学编程-用Django撸个Blog(四)
- Wolf从零学编程-用Django撸个Blog(五)
- Wolf从零学编程-用Django撸个Blog(六)
- Wolf从零学编程-用Django撸个Blog(八)服务器部署
- Wolf从零学编程-用Python打造简单加密程序(七)
- Wolf从零学编程-用Python打造简单加密程序(七)
- Wolf从零学编程-用Python打造简单加密程序(一)
- Wolf从零学编程-用Python打造简单加密程序(二)
- Wolf从零学编程-用Python打造简单加密程序(三)
- Wolf从零学编程-用Python打造简单加密程序(五)
- Wolf从零学编程-用Python打造简单加密程序(六)
- Wolf从零学编程-用Python打造简单加密程序(八)
- Wolf从零学编程-用Python打造简单加密程序(一)
- Wolf从零学编程-用Python打造简单加密程序(二)
- Guava 简介(后补)
- 比goto跳转的更远的函数
- Ubuntu14.04安装Spark和Storm+实例解析
- Spring学习-22:Spring的AOP:基于AspectJ的XML配置方式开发
- eclipse 打开txt文件乱码
- Wolf从零学编程-用Django撸个Blog(七)
- 多态
- Android事件拦截机制分析
- Http 模拟form表单提交Post请求
- 帝国CMS验证码不显示的解决方法
- 监听器与过滤器
- python解析XML:ElementTree(元素树)
- At Commands:从白痴到大师的修炼历程(五)
- tableview创建(swift)