Django 安装与配置 + 极简单Blog搭建(Django实例)

来源:互联网 发布:剑三脸型数据怎么导出 编辑:程序博客网 时间:2024/04/30 11:36
这文章比较全面了 http://canbeatle.javaeye.com/blog/204739

安装以后,试试创建一个新的Django项目:
D:\Python26>python d:\Python26\Scripts\django-admin.py startproject Hector
之后再当前目录下就会出来一个新的文件夹Hector
里面有4个文件:
__init__.py会把项目目录变成一个python的 package(相关的python模块的集合),让我们可以用"."来指定项目中的某个部分。例如Hector.urls。
manage.py是一个同这个Django项目一起工作的工具,可执行。
settings.py包含了项目的默认设置。包括数据库信息、调试标记以及其他的一些重要变量。
urls.py在Django里叫URLconf,它是一个将URL模式映射到应用程序上的配置文件。

之后在命令行下 manage.py runserver
D:\Python26\Hector>manage.py runserver
出现以下信息
Validating models...
0 errors found

Django version 1.2, using settings 'Hector.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

然后再浏览器里http://127.0.0.1:8000/传说就可以了。
但是我这里却出了JSON目录下的encoder.py和decoder.py的错误
寻觅各种方式解决未果
后来把
http://code.djangoproject.com/svn/django/trunk/django/utils/simplejson/decoder.py
http://code.djangoproject.com/svn/django/trunk/django/utils/simplejson/encoder.py
覆盖到原有文件。

终于出来了

It worked!

Congratulations on your first Django-powered page.

Of course, you haven't actually done any work yet. Here's what to do next:

  • If you plan to use a database, edit the DATABASES setting in Hector/settings.py.
  • Start your first app by running python Hector/manage.py startapp [appname].

You're seeing this message because you have DEBUG = True in your Django settings file and you haven't configured any URLs. Get to work!

————————————————— 基本安装就到这里了————————————————————

——————————————————按部就班创建Blog————————————————————

项目“Hector”建立以后,可以开始创建应用
D:\Python26\Hector>manage.py startapp blog #创建一个名为Blog的应用
此时Hector目录下会多出一个blog子目录。
此时要告诉Django这个app是项目的一部分(?这个东西不就是Django生出来的吗,怎么还要配置?不管了),编辑settings.pywenjian ,在文件尾找到INSTALLED_APPS元组,将app以模块形式添加到元组里。

INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'Hector.blog',    #add by Hector  #在我本地必须写成这样:'blog',我用的是django1.4

现在开始创建点新的东西吧:
在app blog中的models.py文件中创建一个提交blog的类

from django.db import models

# Create your models here.
#这个地方复制后要注意缩进
class BlogPost(models.Model):
title = models.CharField(max_length = 150)
body = models.TextField()
timestamp = models.DateTimeField()

然后设置数据库,这里选择的是与python一同发放的sqlite3
在settings.py 中设置数据库种类以及数据库名。

DATABASES = {
'default': {
'ENGINE': 'sqlite3',
'NAME': r'd:\python26\Hector\Blog.db', #名字可以随意起
……

用sqlite3的话就改这两个就好了。

之后告诉Django用提供的链接信息区链接数据库并设置应用程序所需要的表。
D:\Python26\Hector>manage.py syncdb

执行syncdb命令时,Django会查找INSTALLED_APPS中的每一个models.py文件,为找到的每一个model创建一个数据表。

Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table auth_message
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table blog_blogpost

然后被问到一些和django认证的东西,还不知道是什么。

You just installed Django's auth system, which means you don't have any superuse
rs defined.
Would you like to create one now? (yes/no): yes
Username: Hector
E-mail address: ***************
Password:
Password (again):
Superuser created successfully.
Installing index for auth.Permission model
Installing index for auth.Group_permissions model
Installing index for auth.User_user_permissions model
Installing index for auth.User_groups model
Installing index for auth.Message model
No fixtures found.

——————————————————这里数据库的初始化就完成了。————————————————

然后简单接触一下自动化后台应用程序admin。
由于他不是Django的必要组件,所以需要再settings.py中指定使用。
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'Hector.blog',    #add by Hector # 与上面一样,改成'bolg',
# Uncomment the next line to enable the admin:
'django.contrib.admin', #add by Hector


然后要做的就是为新增的app更新数据表啦
D:\Python26\Hector>manage.py syncdb
Creating table django_admin_log
Installing index for admin.LogEntry model
No fixtures found.

设置完app以后,需要为它指定一个URL,这样才能访问到它。打开urls.py

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

# Uncomment the next line to enable the admin:
# (r'^admin/', include(admin.site.urls)),

删掉第二行的注释,就告诉了Django去加载默认的admin站点,这是被用于contrib admin应用程序的第一个特殊对象。

最后我们需要告诉Django需要再admin窗口里面显示哪个model以供编辑。要做到这一点很简单,只要定义之前提到的默认admin站点,并注册BlogPost model就可以了。

打开Hector\blog\models.py,导入admin应用:
加入   from django.contrib import admin
然后再最后一行添加上注册model的代码

如下所示:

from django.db import models
from django.contrib import admin

# Create your models here.
class BlogPost(models.Model):
    title = models.CharField(max_length = 150)
    body = models.TextField()
    timestamp = models.DateTimeField()

admin.site.register(BlogPost)



现在重新启动server 看看admin app的效果,输入用户名和密码以后就可以看到以下的

写两篇blog以后,会发现竟然所有的题目都是BlogPost Object。可以通过修改models.py里面的类更改title。步骤如下:

#新增一个BlogPostAdmin:
class BlogPost(models.Model): #这个是之前就有的
title = models.CharField(max_length = 150)
body = models.TextField()
timestamp = models.DateTimeField()

class BlogPostAdmin(admin.ModelAdmin):
list_display = ('title','timestamp')

#注册这个类
admin.site.register(BlogPost,BlogPostAdmin)

保存以后,服务器会发现更新,并且重新导入model文件(cmd中可以看到)。
刷新页面就会发现blog根据了list_display来生成输出了。

Admin还有其它很多特性只需要通过一两行代码就可以激活:如搜索、自定义排序、过滤等等。

建立Blog的公共部分
上面只是管理部分,现在开始创建面向公众的部分。从Django的角度来说,一个页面具有三个典型的组件:
一个模板(template):  负责将传递进来的信息显示出来。
一个视图(view)      :  负责获取要显示的信息,通常从数据库中获得。
一个URL模式,用来把收到的请求和视图函数项相匹配,有时也会向视图传递一些参数。
不是很懂,下面慢慢看。

创建模板
在Django中,模板语言很简单。显示单个blog帖子的模板是:
<h2>{{ post.title }} </h2>
<p> {{ post.timestamp }} <p>
<p> {{ post.body }} <p>

在变量标签{ post.title }中,用到python的点记号访问传递给模板的数据。例如这里假设传递了一个叫"post"的BlogPost对象。三行模板代码分别从BlogPost对象中获得了值。

假如需要一页显示多篇blog,则增加一个for的块标签。快标签包含在{ % % }中。
{% for post in posts %}
<h2>{{ post.title }} </h2>
<p> {{ post.timestamp }} <p>
<p> {{ post.body }} <p>
{% endfor %}
保存为“archive.html”存放在blog app目录下的templates目录中(模板本身名字任意,但所在目录的名字是强制的)。

然后创建一个视图函数:
打开views.py。

# Create your views here.

from django.template import loader, Context
from django.http import HttpResponse
from mysite.blog.models import BlogPost

def archive(request): #每个Django视图函数都会将django.http.HttpRequest对象作为第一个参数
posts = BlogPost.objects.all()  #BlogPost作为django.db.model.Model的一个子类时,就可以使用对象关系映射(ORM)
#获得Django的对象关系映射,从而获取数据库里面所有的BlogPost对象
t = loader.get_template("archive.html")  #告诉django模板名字,即可创建对象
c = Context({ 'posts' : posts })         #模板渲染的数据是由一个字典类对象context提供的,指示<键、值>
return HttpResponse(t.render(c))         #每个Django视图函数都会返回django.http.HttpResponse对象,最简单的方式是给构造函数传递字符串

注意django1.4跟以前版本的区别,在django1.4中把mysite.去掉才行。

 


一点润色
恩美工还是很丑。我们现在的模板是基于blog这个app的,假如加入了相册,链接页面等,并希望所有的这些能够基于同一个风格的话应该怎么办呢?Django里面可以创建一个基础模板,然后在此之上扩展出其它的特定模板。在Hector/blog/templates目录中,创建一个base.html的模板吧:(不会CSS ,照抄)

<html>
<style type = "text/css">
<body> {color: #efd;background:#000; padding:0 5em; margin: 0}

h1{padding: 1.2em 1em; background:#727; color:#111; font-

family:Calibri; text-align:center; font-size: 200%}
h2{backgournd:#505; color: #343; border-top:1px dotted #fff;

margin-top: 2em ; font-family: Calibri; font-size: 140%}
p{margin: 1em 0}
</style>
<body>
<h1>Hector's Fantastic World</h1>
{% block content %}
{% endblock %}
</body>
</html>

然后在archive.html头中加入new的语句,为基础模板进行扩展。
{% extends "base.html" %} #new
{% block content %} #new
{% for post in posts %}
<h2>{{ post.title }} </h2>
<p> {{ post.timestamp }} <p>
<p> {{ post.body }} <p>
{% endfor %}
{% endblock %} #new

简单排序
为了给post按时间倒序排序,可以在blog/models.py中 为BlogPost加入嵌套类Meta,使用ordeing属性,利用‘-’作倒序排序。
class BlogPost(models.Model):
title = models.CharField(max_length = 150)
body = models.TextField()
timestamp = models.DateTimeField()
class Meta: #new
ordering = ('-timestamp',) #new

过滤器:
May 25, 2010, 10:48 a.m. 这种类型的时间表达方式貌似有点古怪,可以使用Django的过滤器弄得人性化一点。
打开archive.html,将post.timestamp哪行
<p> {{ post.timestamp }} </p> 改成
<p> {{ post.timestamp|date }} </p>
管道符号接到变量后面就可以把过滤器用到变量了。
我们也可以传递自己的一个strftime风格的格式化串,如下面这个就是改写成 年, 月,日,星期的字符串
<p> {{ post.timestamp|date:"Y, F jS, l" }} </p>
2010, May 25th, Tuesday

之后就可以看到这个极其简单的blog页面了~

原创粉丝点击