BLOG
Enjoy when you can, and endure when you must.
NOV 06, 2012/Django
Django个人博客开发(四)

本文已历史长远,建议阅读最新的《用 Django 构建简易博客》系列文章

 

经过前面三节的努力,我们的博客雏形已经建立起来了,从这一节开始,我们的主要任务就放在基本功能的实现。

这一部分的主要内容:

· 完善模板

· 静态文件的使用

· Django站点管理

 

一、美化站点与静态文件:

之前我们构建的模板,如果要说敷衍了事,也的确是。因为那既是一个没有头没有尾的残缺页面,也没有任何的美化效果,所有的东西都是很牵强的从上到下依次摆在上面。这很明显不符合一个站点的要求。

一个网站确确实实需要设计、美化,形象很重要嘛。所以在继续之前,我认为你还是应该好好构思一个你的博客要怎么排版,然后在PS等工具中做出效果图。当然,如果不愿意自己设计美化,也可以使用如Bootstrap这样的框架来达到相同的目的。这里,我为了方便,就以我自己的页面设计作为例子继续讲述。

完成页面的设计之后,肯定会得到如图片、CSS样式表、JS脚本等静态文件,要在Django中正确使用这些文件,我们需要做一些配置。

首先,回到项目的根目录,新建一个文件夹并命名为static,现在,你的项目目录应该包含这些文件(目录)了:

   [danny@localhost dblog]$ ls -l

   total 20

   drwxrwxr-x. 2 danny danny 4096 Nov  6 00:37 blog

   drwxrwxr-x. 2 danny danny 4096 Nov  2 21:35 data

   drwxrwxr-x. 2 danny danny 4096 Nov  6 00:38 dblog

   -rwxr-xr-x. 1 danny danny  248 Oct 29 00:51 manage.py

   drwxrwxr-x. 2 danny danny 4096 Nov  6 21:11 static

   drwxrwxr-x. 2 danny danny 4096 Nov  6 00:34 templates

进入到static目录,新建三个子目录,分别命名为images、js、css,。然后打开settings.py,添加如下内容:

   STATICFILES_DIRS = (

       # Put strings here, like "/home/html/static" or "C:/www/django/static".

       # Always use forward slashes, even on Windows.

       # Don't forget to use absolute paths, not relative paths.

       '/home/danny/dblog/static',

   )

别忘记将路径该为你自己的,而且这里我故意未删除原有的注释:一定要使用绝对路径。

保存并关闭,再打开urls.py文件,加入如下内容:

    (r'^static/(?P<path>.*)$', 'django.views.static.serve',
        {'document_root': '/home/danny/dblog/static'}),
)

现在你就可以放心大胆的将静态文件放在对应的文件夹中了。

 

二、完善“残缺的”模板:

我的主页设计好了,正如你看到的这样,现在我们就把它加入到index.html中:

           
<html xmlns="http://www.w3.org/1999/xhtml">
           
<head>
           
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
           
  <title>DannyBlog</title>
           
  <link href="/static/css/dblog.css" rel="stylesheet" type="text/css" />
           
</head>
           
<body>
  <div class="container">
    <div class="header">
           
        <div id="top">
          <a href="/blog/"><img src="/static/images/LOGO.png" alt="LOGO" name="logo" width="180" height="60" id="logo" /></a>
          <div id="nav_div">
           
            <ul id="top_nav">
           
              <li><a href="/" class="a_normal">首页</a></li>
           
              <li><a href="#" class="a_normal">订阅</a></li>
           
              <li><a href="#" class="a_normal">关于</a></li>
           
            </ul>
          </div>
           
        </div>
    <!-- end .header --></div>
           
    <div class="content_body">
      <div class="main_body">
        {% for blog in blogs %}
          <div class="blog_body">
            <div class="blog_title"><a href="/detail/?id={{ blog.id }}">{{ blog.caption }}</a></div>
            <div class="blog_info1">
              <span class="blog_info1_list">
                <span class="li_small_1">分类:<a href="#">{{ blog.classification }}</a></span>
                <span class="li_small_1">发表时间:{{ blog.publish_time|date:"Y-m-d H:i" }}</span>
              </span>
            </div>
            <div class="blog_splitline"></div>
            <div class="blog_description">{{ blog.content }}</div>
            <div class="blog_info2">
              <span class="blog_info2_list">
                <span class="li_small_2">标签:{% for tag in blog.tags.all %}<a href="#">{{ tag.tag_name }}</a>{% endfor %}</span>
              </span>
            </div>
          </div>
        {% endfor %}
      </div>
    </div>
           
    <div class="footer">
      <div id="footer_logo"></div>
      <div id="siteinfo">&copy; 2007 - 2012 DannyWork Project</div>
    <!-- end .footer --></div>
  <!-- end .container --></div>
</body>
</html>

现在再次打开浏览器访问我们的项目主页,应该看着好多了,不过还没有内容,下面我们就来添加点博客进去。

 

三、使用Django站点管理:

虽然刚才说到为我们的博客添加点文章好充充数预览下效果,不过要怎么添加呢?到目前为止,好像我们还没有这方面内容的积累。也许你会想,可以通过之前的模型操作方法直接向数据库中添加数据?不过这种操作方法太不现实了。更理想的是我们需要一个后台的管理界面,可以方便的对网站数据进行增加、更改、删除等操作。不过自己开发一个这样的管理界面实在是过于繁琐了,还好Django为我们提供了一个自动管理界面,可以很方便的开启使用。

Django自动管理工具是django.contrib的一部分。django.contrib是一套庞大的功能集,它是Django基本代码的组成部分,Django框架就是由众多包含附加组件(add-on)的基本代码构成的。你可以把django.contrib看作是可选的Python标准库或普遍模式的实际实现。它们与Django捆绑在一起,这样你在开发中就不用“重复发明轮子”了。

让我们马上行动吧,打开settings.py文件并检查或修改以下项:

   · 将'django.contrib.admin'加入setting的INSTALLED_APPS配置中并确保之中还包含'django.contrib.auth','django.contrib.contenttypes'和'django.contrib.sessions';

   · 确保MIDDLEWARE_CLASSES包含 'django.middleware.common.CommonMiddleware'、 'django.contrib.sessions.middleware.SessionMiddleware' 和 'django.contrib.auth.middleware.AuthenticationMiddleware'。

回到项目根目录,运行python manage.py syncdb,如果之前添加过超级用户,这里会直接跳过,否则会要求你添加,按步骤操作即可。

最后再打开urls.py,增加如下内容:

admin.autodiscover()
           
urlpatterns = patterns('',
    # ...
    url(r'^admin/', include(admin.site.urls)),
    # ...
)

这样就完成了,打开浏览器(如果你停止了开发服务器,请重新运行)并访问http://django_server_ip:8000/admin/,即可看到Django站点管理的登录界面:

输入之前创建的超级用户的用户名和密码即可登录:

不过我们自己的模型貌似还没在这里出现。打开blog项目的目录,新建admin.py文件并输入如下内容:

from blog.models import Tag, Author, Article, Classification
           
class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', 'email', 'website')
    search_fields = ('name',)
           
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('caption', 'subcaption', 'classification', 'author', 'publish_time', 'update_time')
    list_filter = ('publish_time',)
    date_hierarchy = 'publish_time'
    ordering = ('-publish_time',)
    filter_horizontal = ('tags',)
           
admin.site.register(Article, ArticleAdmin)
admin.site.register(Author, AuthorAdmin)
admin.site.register(Tag)
admin.site.register(Classification)

重启一下开发服务器,再次访问管理页面,你会发现需要的东西出现了。

这里我们新建了一个AuthorAdmin类和ArticleAdmin类,它是从django.contrib.admin.ModelAdmin派生出来的子类,保存着一个类的自定义配置,以供管理工具使用。我们自定义了一项:list_display,它是一个字段名称的元组,用于列表显示;而search_fields会在页面顶端加入一个搜索栏,。当然,这些添加的字段名称必须是模块中有的。我们修改了admin.site.register()调用,在Author后面添加了AuthorAdmin。你可以这样理解:用AuthorAdmin选项注册Author模块。admin.site.register()函数接受一个ModelAdmin子类作为第二个参数。如果你忽略第二个参数,Django将使用默认的选项。

其它就不一一列举说明了,需要了解更多的内容可以参考Django官方文档。

现在就让我们利用这个管理系统添加一个新的博客,内容就随便你啦,然后刷新主页,是不是出现了呢?

这一小节内容就结束了,如需系统学习,可以参考《The Django Book》第三、四、六章的内容。

COMMENTS
21/03From test

这个评论是通过ajax么

17/03From m

没有提供静态文件么,看来要自己在网站上面扒咯

23/01From aa

我来验证下评论

21/11From kdplus

请问博主您现在还在使用admin来管理站点么?不是的话,用户权限方面该怎么写?我的博客目前处于谁都可以编辑的状态23333...

07/10From Augustus

我一开始也是这个问题,后来成功解决了,只要在admin.py中输入from django.contrib import admin就好了

07/09From Danny

注意django版本,这篇博客已经很老了,只能针对1.4以前的版本。

04/09From imkh

为什么会提示”name 'admin' is not defined“,呢,代码就算直接复制你的也会提示这样。

19/08From 企和

调用这个前 admin.autodiscover() 得先导入f rom django.contrib import admin

08/04From Danny

亲,是说的哪里的标签叠在一起了呀?

08/04From xxf

点个赞~\(≧▽≦)/~plus~右边有一些标签叠在一起了~

LEAVE COMMNT