Fork me on GitHub
创建一个简单的基于MVC的Django项目

创建一个最简单的Django项目中,我们已经创建了一个项目的骨架,并能够正常访问,在这基础上,我们再接着来创建一个基于MVC的Django项目。

 

执行以下命令来创建一个entries模块:

Python代码  收藏代码
  1. python manage.py startapp entries  

至此,blogs项目中,包括以下部分:


其中,blogs目录包括以下几项:


entries目录包括以下几项:

接下来,我们需要两个模型,分别对应Category表和Entry表,用来存储博客分类以及博客,每篇博客都会有一个外键标记所属的分类。下面打开entries目录下的models.py文件,按照以下代码进行模型的定义:

Python代码  收藏代码
  1. from django.db import models  
  2. from django.contrib import admin  
  3. import datetime  
  4.   
  5. # Create your models here.  
  6. class Category(models.Model):   
  7.  name = models.CharField(max_length=50, unique=True)   
  8.  def __unicode__(self):   
  9.    return self.name   
  10.  class Meta:   
  11.    ordering = ['name']   
  12.  class Admin:   
  13.    pass  
  14.   
  15. class Entry(models.Model):   
  16.  title = models.CharField(max_length=50)   
  17.  created_at = models.DateTimeField(default=datetime.datetime.now)   
  18.  published = models.BooleanField(default=False)   
  19.  category = models.ForeignKey(Category)   
  20.  def __unicode__(self):   
  21.    return self.title   
  22.  class Meta:   
  23.    ordering = ['-created_at''title'# 符号-表示按照日期倒序排列   
  24.  class Admin:   
  25.    pass  
  26.   
  27. admin.site.register(Category)  
  28. admin.site.register(Entry)  

在类Admin的设置中,允许Django针对当前的Models模型自动生成Django超级用户的后台管理入口。

 

接下来的工作就是让Django部署并在数据库中生成已经写好的Models模型。

在Django中,与工程全局相关的设置都需要在配置文件settings.py中添加。下面打开blogs目录下的settings.py文件,修改数据库配置如下:

Python代码  收藏代码
  1. DATABASES = {  
  2.     'default': {  
  3.         'ENGINE''django.db.backends.mysql'# Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.  
  4.         'NAME''blogs',                      # Or path to database file if using sqlite3.  
  5.         'USER''root',                       # Not used with sqlite3.  
  6.         'PASSWORD''',                  # Not used with sqlite3.  
  7.         'HOST''',                      # Set to empty string for localhost. Not used with sqlite3.  
  8.         'PORT''',                      # Set to empty string for default. Not used with sqlite3.  
  9.     }  
  10. }  

这里要注意的是,如果使用SQLite数据库,Django可以根据数据库的名称自动在SQLite中创建新的数据库,而在MySQL、PostgreSQL或其他的数据库中,则需要先创建与设定名称对应的数据库。在使用MySQL数据库时,需要额外安装MySQL的Python链接库MySQLdb,这个模块可以在http://sourceforge.net/projects/mysql-python/进行下载。

 

安装MySQLdb的时候,如果遇到下面的错误:

Python代码  收藏代码
  1. Eric-MacBook-Pro:MySQL-python-1.2.4b4 jsntghf$ sudo python setup.py install  
  2. sh: mysql_config: command not found  
  3. Traceback (most recent call last):  
  4.   File "setup.py", line 18in <module>  
  5.     metadata, options = get_config()  
  6.   File "/Users/jsntghf/Downloads/MySQL-python-1.2.4b4/setup_posix.py", line 43in get_config  
  7.     libs = mysql_config("libs_r")  
  8.   File "/Users/jsntghf/Downloads/MySQL-python-1.2.4b4/setup_posix.py", line 25in mysql_config  
  9.     raise EnvironmentError("%s not found" % (mysql_config.path,))  
  10. EnvironmentError: mysql_config not found  

执行以下命令即可:

Shell代码  收藏代码
  1. sudo ln -s /usr/local/mysql/bin/mysql_config /usr/local/bin/mysql_config  

为了使Django识别开发者添加的应用模块,在settings.py文件的INSTALLED_APPS部分中,需要定义Django工程加载的应用列表。默认情况下,列表中已经添加了Django工程运行所需的部分自带模块,我们还需要把刚才编写好的应用模块entries加入其中,同时添加Django自带的django.contrib.admin应用模块:

Python代码  收藏代码
  1. INSTALLED_APPS = (  
  2.     'django.contrib.auth',  
  3.     'django.contrib.contenttypes',  
  4.     'django.contrib.sessions',  
  5.     'django.contrib.sites',  
  6.     'django.contrib.messages',  
  7.     'django.contrib.staticfiles',  
  8.     # Uncomment the next line to enable the admin:  
  9.     'django.contrib.admin',  
  10.     'entries',  
  11.     # Uncomment the next line to enable admin documentation:  
  12.     # 'django.contrib.admindocs',  
  13. )  

添加admin模块后还不能立即使用Django的admin后台管理界面,需要打开blogs目录下的urls.py文件,进行如下修改:

Python代码  收藏代码
  1. from django.conf.urls import patterns, include, url  
  2.   
  3. # Uncomment the next two lines to enable the admin:  
  4. from django.contrib import admin  
  5. admin.autodiscover()  
  6.   
  7. urlpatterns = patterns('',  
  8.     # Examples:  
  9.     # url(r'^$', 'blogs.views.home', name='home'),  
  10.     # url(r'^blogs/', include('blogs.foo.urls')),  
  11.   
  12.     # Uncomment the admin/doc line below to enable admin documentation:  
  13.     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),  
  14.   
  15.     # Uncomment the next line to enable the admin:  
  16.     url(r'^admin/', include(admin.site.urls)),  
  17. )  

这样访问admin模块时,Django就可以顺利解析访问地址,并转向后台管理界面。

 

接下来就可以执行python manage.py syncdb指令了。Django会根据模型的定义自动完成ORM的数据库映射工作,屏蔽了底层数据库细节和SQL查询的编写。执行完后,Django已经根据我们刚才在models里定义的映射文件,自动在数据库里创建好对应的表和字段。命令执行的同时会提示用户创建superuser账户,用来登录Django自动创建好的后台管理界面对模型进行管理。



执行python manage.py syncdb的时候,如果遇到下面的错误:

Python代码  收藏代码
  1. Eric-MacBook-Pro:blogs jsntghf$ sudo python manage.py syncdb  
  2. Traceback (most recent call last):  
  3.   File "manage.py", line 10in <module>  
  4.     execute_from_command_line(sys.argv)  
  5.   File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 443in execute_from_command_line  
  6.     utility.execute()  
  7.   File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 382in execute  
  8.     self.fetch_command(subcommand).run_from_argv(self.argv)  
  9.   File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 261in fetch_command  
  10.     klass = load_command_class(app_name, subcommand)  
  11.   File "/Library/Python/2.7/site-packages/django/core/management/__init__.py", line 69in load_command_class  
  12.     module = import_module('%s.management.commands.%s' % (app_name, name))  
  13.   File "/Library/Python/2.7/site-packages/django/utils/importlib.py", line 35in import_module  
  14.     __import__(name)  
  15.   File "/Library/Python/2.7/site-packages/django/core/management/commands/syncdb.py", line 8in <module>  
  16.     from django.core.management.sql import custom_sql_for_model, emit_post_sync_signal  
  17.   File "/Library/Python/2.7/site-packages/django/core/management/sql.py", line 6in <module>  
  18.     from django.db import models  
  19.   File "/Library/Python/2.7/site-packages/django/db/__init__.py", line 40in <module>  
  20.     backend = load_backend(connection.settings_dict['ENGINE'])  
  21.   File "/Library/Python/2.7/site-packages/django/db/__init__.py", line 34in __getattr__  
  22.     return getattr(connections[DEFAULT_DB_ALIAS], item)  
  23.   File "/Library/Python/2.7/site-packages/django/db/utils.py", line 92in __getitem__  
  24.     backend = load_backend(db['ENGINE'])  
  25.   File "/Library/Python/2.7/site-packages/django/db/utils.py", line 24in load_backend  
  26.     return import_module('.base', backend_name)  
  27.   File "/Library/Python/2.7/site-packages/django/utils/importlib.py", line 35in import_module  
  28.     __import__(name)  
  29.   File "/Library/Python/2.7/site-packages/django/db/backends/mysql/base.py", line 16in <module>  
  30.     raise ImproperlyConfigured("Error loading MySQLdb module: %s" % e)  
  31. django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.7-intel.egg/_mysql.so, 2): Library not loaded: libmysqlclient.18.dylib  
  32.   Referenced from: /Library/Python/2.7/site-packages/MySQL_python-1.2.4b4-py2.7-macosx-10.7-intel.egg/_mysql.so  
  33.   Reason: image not found  

执行以下命令即可:

Shell代码  收藏代码
  1. sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/  

使用命令python manage.py runserver来启动Django自带的Web服务器后,在浏览器中访问地址http://localhost:8000/admin/,使用刚才创建的superuser用户的账号和密码登录,漂亮的Django后台管理界面就出现在眼前。

如果想显示成中文界面,修改settings.py中的以下设置即可:

Python代码  收藏代码
  1. LANGUAGE_CODE = 'zh-cn'  

至此,模型层已经完成,接下来要实现的就是控制层以及视图层了。

 

修改views.py,代码如下:

Python代码  收藏代码
  1. # Create your views here.  
  2. from django.shortcuts import render_to_response   
  3. from entries.models import Category   
  4.   
  5. def categories_report(request):   
  6.  listing = []   
  7.  for category_list in Category.objects.all():   
  8.    category_dict = {}   
  9.    category_dict['item_object'] = category_list   
  10.    category_dict['item_count'] = category_list.entry_set.count()   
  11.    category_dict['item_name'] = category_list.name  
  12.    category_dict['item_published'] = category_list.entry_set.filter(published=True).count()   
  13.    category_dict['percent_published'] = int(float(category_dict['item_published']) / category_dict['item_count'] * 100)   
  14.    listing.append(category_dict)   
  15.  return render_to_response('categories.html', { 'listing': listing })  

Category.objects.all方法返回categories列表中所有的记录项,Django可以根据后台数据库转换成相应的SQL语句,在后台数据库中执行并返回查询结果。

每一个category都有entry_set属性,代表categories中的每一个entry项。如果需要设置查询条件,也可以使用entry_set.filter方法来返回符合特定要求的entry项。

render_to_response函数返回浏览器指定的HTML页面,页面为Django的Template模板,负责展示被请求的页面内容。

 

接下来就是要创建categories.html这个模板文件了。首先,在entries目录创建一个templates文件夹,然后,在这个模板目录里创建所需的categories.html模板文件:

Python代码  收藏代码
  1. <html>   
  2.  <head>   
  3.    <meta http-equiv="Content-Type" content="text/html" />   
  4.    <title>统计列表</title>   
  5.  </head>   
  6.  <body>   
  7.    <h1>统计列表</h1>   
  8. {% for category_dict in listing %}   
  9.    <ul>   
  10.      <li>分类: {{ category_dict.item_name }}</li>   
  11.      <li>数目: {{ category_dict.item_count }}</li>   
  12.      <li>已发布的数目: {{ category_dict.item_published }} ({{ category_dict.percent_published }}%)</li>   
  13.    </ul>   
  14. {% endfor %}   
  15.  </body>   
  16. </html>  

接下来要做的就是告诉Django模板的位置, 修改settings.py中的TEMPLATE_DIRS项:

Python代码  收藏代码
  1. TEMPLATE_DIRS = (  
  2.     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".  
  3.     # Always use forward slashes, even on Windows.  
  4.     # Don't forget to use absolute paths, not relative paths.  
  5.     './entries/templates',  
  6. )  

接下来就是修改urls.py,在最后加上以下这句:

Python代码  收藏代码
  1. url(r'^report/$''entries.views.categories_report'),  

现在,访问http://localhost:8000/report/即可看到列表了。

 

 

 

 

分享到:  

Django LDAP认证方式使用

我们基于Django框架实现了MySQL数据库管理的web系统,为了能直接使用域用户登录,需要在Django中集成LDAP认证。一开始由于对Django和LDAP都不熟悉,也折腾了很长时间。   首先需要安装以下模块: django-1.4.3 openldap-2.4.33 python-ldap-2.4.10 (需要有cyrus-sasl-devel.x86_64) django ...
0顶0踩
CtripMySQLDBA 评论(0) 有79人浏览 2013-05-30 16:44

Django RequestContext

模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把u ...
1顶3踩
lantian_123 评论(2) 有253人浏览 2013-05-21 23:57

最新文章列表

Django LDAP认证方式使用

我们基于Django框架实现了MySQL数据库管理的web系统,为了能直接使用域用户登录,需要在Django中集成LDAP认证。一开始由于对Django和LDAP都不熟悉,也折腾了很长时间。   首先需要安装以下模块: django-1.4.3 openldap-2.4.33 python-ldap-2.4.10 (需要有cyrus-sasl-devel.x86_64) django ...
CtripMySQLDBA 评论(0) 有84人浏览 2013-05-30 16:44

Python——十年语言之冠

  英文原文:Python - language of the decade   最近我发现了这个 PYPL——编程语言流行指数。它对各种语言的流行指标进行了二次发掘。作者指出 TIOB ...
djangochina 评论(0) 有64人浏览 2013-05-22 15:16

Django RequestContext

模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把u ...
lantian_123 评论(2) 有255人浏览 2013-05-21 23:57

django:数据库修改工具South的正确使用方式(转)

本文转自(http://www.cnblogs.com/yanng/archive/2011/12/13/2286132.html) 仅此备忘 1)创建一个没有数据库的新项目时     1、创建数据库     2、将south添加到INSTALLED_APPS     3、运行syncdb命令,它将django和south的数据表加入到数据库中     4、将你创建的apps添加到INSTALLED ...
iyuan 评论(0) 有35人浏览 2013-05-09 17:08

diango创建数据异常no module named base

本人使用django创建web项目使用的数据库是sqlite3,python版本为2.5.4,django版本为1.4.5 然后我创建了一个project,配置settings.py文件为 DATABASES = {     'default': {         'ENGINE': 'sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3 ...
怡然城南 评论(0) 有123人浏览 2013-05-05 22:02

运行django出现 Error: [Errno 10013]的错误

运行django出现 Error: [Errno 10013]的错误,是因为8000端口被占用了,我本地开了酷狗音乐,将它退出即可,或者是运行django时换一个端口即可。
jsntghf 评论(0) 有57人浏览 2013-05-05 13:12

使用Tornado+Nginx部署Django的一种尝试(转)

转自:奋斗足迹|崔玉松 http://fendou.org/post/2012/06/01/tornad-nginx-django/ 使用Tornado+Nginx部署Django的一种尝试 Tornado是一个异步web框架和服务器,所以在开�� ...
sls0919 评论(0) 有66人浏览 2013-04-22 16:01

python django 服务器搭建

公司近期服务器虚拟化,需要将物理机上面的应用全部迁移至虚拟机。我负责的这块应用是用python语言开发django框架搭建的一个博客系统。 运维分配了一台虚拟机,啥都没装---------------------------------------------------------------------------------- 服务器上面没有rz sz安装一下       lrzsz-0.12 ...
speedup 评论(0) 有306人浏览 2013-04-15 10:54

Django错误 - ImportError: No module named django.core.management

问题描述: 在命令行输入 manage.py runserver,提示找不到django.core.management模块。 问题分析: 1. 确定Django已安装,进行Django的安装目录查看,django.core.management确实存在 2. 电脑上有两个版本的Python,查看环境变量设置的那个Python版本有安装Django 3. 依次在命令行输入 : python im ...
幽绿琵琶 评论(0) 有58人浏览 2013-04-08 15:21

django实例

django 实例
yanshaozhi 评论(0) 有124人浏览 2013-03-30 21:23

ajax跨域访问(备忘)

老生常谈的问题,存此备忘: html5解决方案(老方案也有) server端解决方案 django修改response header
iyuan 评论(0) 有87人浏览 2013-03-22 15:00

PyCharm的Django设置截图

截图如下:
freespace 评论(0) 有92人浏览 2013-03-14 07:52

PyDev的安装

PyDev for Eclipse是一个功能强大且易用的Eclipse Python IDE插件,在安装PyDev之前,要保证您已经安装了Java 1.4或更高版本、Eclipse以及Python。接下来,开始安装PyDev插件。   1、启动Eclipse,在Eclipse菜单栏中找到Help栏,选择Help > Eclipse Marketplace   2、在Find中输入py ...
jsntghf 评论(0) 有99人浏览 2013-02-24 11:31

用Django创建一个hello world

编辑urls.py,在urlpatterns = patterns('',前面加入以下代码:   from django.http import HttpResponse def hello(request): return HttpResponse('hello, world!')   然后在urlpa ...
jsntghf 评论(0) 有135人浏览 2013-02-21 15:46

创建一个简单的基于MVC的Django项目

在创建一个最简单的Django项目中,我们已经创建了一个项目的骨架,并能够正常访问,在这基础上,我们再接着来创建一个基于MVC的Django项目。   执行以下命令来创建一个entries模块: python manage.py startapp entries 至此,blogs项目中,包括以下部分: 其中,blogs目录包括以下几项: entries目录包括以下几项: 接下来 ...
jsntghf 评论(0) 有439人浏览 2013-02-18 21:07

Django中静态文件设置方法

静态文件如CSS, javascript, 图片等文件在django中的配置官方文档写的比较模糊,自己通过实验验证后并整理如下,以防遗忘,目前只整理了关于本地开�� ...
lanceverw 评论(0) 有174人浏览 2013-02-13 21:08

django教程写的好

http://djangobook.py3k.cn/2.0/ 超赞,拜读。 python的web框架不要太多... django、flask、bottle、tornado...
polyahu 评论(0) 有168人浏览 2013-02-12 18:35

Django跨站伪造请求保护措施设置方法

在django建站中遇到post提交表单提示403错误, 发现以Post方式提交表单会触发django内置的csrf保护机制,并且在403页面给出了解决方法,根据提示更改后发现问题依旧,网上查阅很多同学的解决方案均不能解决这个问题,所以到官网上查阅了关于csrf部分的具体设置,最后成功解决了这个问题。   官方csrf部分设置翻译: CSRF设置步骤: 第一步: 在settings.py ...
posted on 2013-06-09 18:24  HackerVirus  阅读(499)  评论(0编辑  收藏  举报