本文已历史长远,建议阅读最新的《用 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">© 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》第三、四、六章的内容。
这个评论是通过ajax么
没有提供静态文件么,看来要自己在网站上面扒咯
我来验证下评论
请问博主您现在还在使用admin来管理站点么?不是的话,用户权限方面该怎么写?我的博客目前处于谁都可以编辑的状态23333...
我一开始也是这个问题,后来成功解决了,只要在admin.py中输入from django.contrib import admin就好了
注意django版本,这篇博客已经很老了,只能针对1.4以前的版本。
为什么会提示”name 'admin' is not defined“,呢,代码就算直接复制你的也会提示这样。
调用这个前 admin.autodiscover() 得先导入f rom django.contrib import admin
亲,是说的哪里的标签叠在一起了呀?
点个赞~\(≧▽≦)/~plus~右边有一些标签叠在一起了~