Wolf从零学编程-用Django撸个Blog(四)

目前我完成的工作有:

  • 创建项目和blog应用
  • 创建了article和catogery数据表
  • 打开了django后台管理
  • 最简单的前端与服务器的交互

实际上,我已经实现了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,看到的画面是介个样子的:

Wolf从零学编程-用Django撸个Blog(四)_第1张图片

点击文章标题也只会返回index页面,因为我还没有写文章详情页,届时只需要把超链接改成
即可。

这个页面实在太丑了。这几天在自强学堂上看CSS和JS,慢慢琢磨着改。

这段代码里有三个地方要介绍:

  • 在模板中要使用中文,只需要添加一行就可以了。
  • {% for %}是html中的常用模板标签,作用是循环,使用模板标签必须要有结束标签{% endfor %}。
  • < a >标签表示超链接,关于"href"后URL的写法,可以用{% url ‘app_name:url_name’ param %},app_name是应用的命名空间的名称,在这里就是blog,url_name是目标的地址,即url的name,param是地址的参数,会把参数传到urls.py中的相应url中。

第二步,编写详情页

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。

不管怎么样,今天的任务算是搞定了,以下是点击首页文章标题后的详情页。

Wolf从零学编程-用Django撸个Blog(四)_第2张图片

编写过程中出现的Errors和疑惑都记在一个单独的笔记里,会一条条的解决,所以以前发过的博客也会经常修改~~~

下一篇想要实现博客中的分类和标签功能。

你可能感兴趣的:(Django撸博客)