目前我完成的工作有:
实际上,我已经实现了MTV模式的全部流程:用户在浏览器输入网址url,服务器获得url并在urls.py中寻找匹配项,调用views.py中对应视图函数或类,使用models和其他规则渲染templates,最后返回到用户浏览器。
但是运行起来可以看到,这网页实在是太简陋了,它甚至不能完整的表现出文章的标题,所以接下来的任务就是让首页显示可点击的文章标题。
上次偷懒写的IndexView要改一改。
blog/views.py
#这类视图与ListView通用视图功能一致,所以继承通用视图完成
class IndexView(ListView):
template_name = 'blog/index.html'
#告诉视图对这个页面进行渲染
context_object_name = 'article_list'
#给上下文变量取名,和模板中的那个变量一致
#重写get_queryset方法,只显示已发布的文章
def get_queryset(self):
article_list = Article.objects.filter(status='published')
return article_list
ListView中的get_queryset方法简单直接的获取项目的列表,而对于博客只需要显示状态为‘已发布’的文章列表,所以我们重写这个方法。关于ListView的更多信息,有官网可循。
不想看英文的小伙伴可以看1.8django的中文版的对应部分。
只有一条语句的模板也要重写。
blog/templates/blog/index.html
首页
{% for article in article_list%}
{{article.title}}
{% endfor %}
此时运行服务器,输入127.0.0.1:8000/blog,看到的画面是介个样子的:
点击文章标题也只会返回index页面,因为我还没有写文章详情页,届时只需要把超链接改成
即可。
这个页面实在太丑了。这几天在自强学堂上看CSS和JS,慢慢琢磨着改。
这段代码里有三个地方要介绍:
django中对详情信息也有通用视图DetailView,同样也有官网英文文档和中文版文档可以参考。
blog/views.py
from django.views.generic import ListView,**DetailView**
**import markdown2**
class ArticleView(DetailView):
model = Article #不指定queryset就要指定model
template_name = 'blog/detail.html'
context_object_name = 'article'
pk_url_kwarg = 'article_id' #URLconf中主键的关键字参数的名称
#重写,把正文转换成markdown格式。该方法使用pk_url_kwarg参数查找对象
def get_object(self):
obj = super(ArticleView,self).get_object()
obj.text = markdown2.markdown(obj.text)
return obj
super()是Python的一个继承函数,对于它的理解请参考Python:super函数,看了几篇博客,觉得这篇的作者讲的比较通俗易懂。
然后在URLconf中添加调用视图的url项
urlpatterns = [
url(r'^$',views.IndexView.as_view(),name='index'),
**url(r'^article/(?P\d+)$',views.ArticleView.as_view(),name='detail'),**
#使用简单的正则,匹配浏览器传回的article_id,'()'内就是要捕获的信息
]
这时候只要再搞定模板文件,就可以随意浏览已发布的文章了。
detail.html
Detail
Index
{{article.title}}
{{article.text|safe}}
这时候出现一个问题,在index.html中,我写了中文‘首页’,但在detail.html中,只要出现中文就会报UnicodeDecodeError,百思不得其解,在网上搜了很多篇相关博文,也没解决,只好先Mark。
不管怎么样,今天的任务算是搞定了,以下是点击首页文章标题后的详情页。
编写过程中出现的Errors和疑惑都记在一个单独的笔记里,会一条条的解决,所以以前发过的博客也会经常修改~~~
下一篇想要实现博客中的分类和标签功能。