好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

创建一个简单的基于MVC的Django项目 博客分类:   Python

python django mvc  

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

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

Python代码  

python manage.py startapp entries  

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


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


entries目录包括以下几项:

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

Python代码  

from  django.db  import  models   from  django.contrib  import  admin   import  datetime      # Create your models here.    class  Category(models.Model):     name = models.CharField(max_length= 50 , unique= True )      def  __unicode__( self ):        return   self .name      class  Meta:       ordering = [ 'name' ]      class  Admin:        pass       class  Entry(models.Model):     title = models.CharField(max_length= 50 )     created_at = models.DateTimeField(default=datetime.datetime.now)     published = models.BooleanField(default= False )     category = models.ForeignKey(Category)      def  __unicode__( self ):        return   self .title      class  Meta:       ordering = [ '-created_at' ,  'title' ]  # 符号-表示按照日期倒序排列       class  Admin:        pass       admin.site.register(Category)   admin.site.register(Entry)  

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

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

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

Python代码  

DATABASES = {        'default' : {            'ENGINE' :  'django.db.backends.mysql' ,  # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.             'NAME' :  'blogs' ,                       # Or path to database file if using sqlite3.             'USER' :  'root' ,                        # Not used with sqlite3.             'PASSWORD' :  '' ,                   # Not used with sqlite3.             'HOST' :  '' ,                       # Set to empty string for localhost. Not used with sqlite3.             'PORT' :  '' ,                       # Set to empty string for default. Not used with sqlite3.        }   }  

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

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

Python代码  

Eric-MacBook-Pro:MySQL-python- 1.2 . 4b4  jsntghf$ sudo python setup.py install   sh: mysql_config: command  not  found   Traceback (most recent call last):     File  "setup.py" , line  18 ,  in  <module>       metadata, options = get_config()     File  "/Users/jsntghf/Downloads/MySQL-python-1.2.4b4/setup_posix.py" , line  43 ,  in  get_config       libs = mysql_config( "libs_r" )     File  "/Users/jsntghf/Downloads/MySQL-python-1.2.4b4/setup_posix.py" , line  25 ,  in  mysql_config        raise  EnvironmentError( "%s not found"  % (mysql_config.path,))   EnvironmentError: mysql_config  not  found  

执行以下命令即可:

Shell代码  

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代码  

INSTALLED_APPS = (        'django.contrib.auth' ,        'django.contrib.contenttypes' ,        'django.contrib.sessions' ,        'django.contrib.sites' ,        'django.contrib.messages' ,        'django.contrib.staticfiles' ,        # Uncomment the next line to enable the admin:         'django.contrib.admin' ,        'entries' ,        # Uncomment the next line to enable admin documentation:         # 'django.contrib.admindocs',    )  

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

Python代码  

from  django.conf.urls  import  patterns, include, url      # Uncomment the next two lines to enable the admin:    from  django.contrib  import  admin   admin.autodiscover()      urlpatterns = patterns( '' ,        # Examples:         # url(r'^$', 'blogs.views.home', name='home'),         # url(r'^blogs/', include('blogs.foo.urls')),            # Uncomment the admin/doc line below to enable admin documentation:         # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),            # Uncomment the next line to enable the admin:        url(r '^admin/' , include(admin.site.urls)),   )  

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

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



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

Python代码  

Eric-MacBook-Pro:blogs jsntghf$ sudo python manage.py syncdb   Traceback (most recent call last):     File  "manage.py" , line  10 ,  in  <module>       execute_from_command_line(sys.argv)     File  "/Library/Python/2.7/site-packages/django/core/management/__init__.py" , line  443 ,  in  execute_from_command_line       utility.execute()     File  "/Library/Python/2.7/site-packages/django/core/management/__init__.py" , line  382 ,  in  execute        self .fetch_command(subcommand).run_from_argv( self .argv)     File  "/Library/Python/2.7/site-packages/django/core/management/__init__.py" , line  261 ,  in  fetch_command       klass = load_command_class(app_name, subcommand)     File  "/Library/Python/2.7/site-packages/django/core/management/__init__.py" , line  69 ,  in  load_command_class       module = import_module( '%s.management.commands.%s'  % (app_name, name))     File  "/Library/Python/2.7/site-packages/django/utils/importlib.py" , line  35 ,  in  import_module       __import__(name)     File  "/Library/Python/2.7/site-packages/django/core/management/commands/syncdb.py" , line  8 ,  in  <module>        from  django.core.management.sql  import  custom_sql_for_model, emit_post_sync_signal     File  "/Library/Python/2.7/site-packages/django/core/management/sql.py" , line  6 ,  in  <module>        from  django.db  import  models     File  "/Library/Python/2.7/site-packages/django/db/__init__.py" , line  40 ,  in  <module>       backend = load_backend(connection.settings_dict[ 'ENGINE' ])     File  "/Library/Python/2.7/site-packages/django/db/__init__.py" , line  34 ,  in  __getattr__        return  getattr(connections[DEFAULT_DB_ALIAS], item)     File  "/Library/Python/2.7/site-packages/django/db/utils.py" , line  92 ,  in  __getitem__       backend = load_backend(db[ 'ENGINE' ])     File  "/Library/Python/2.7/site-packages/django/db/utils.py" , line  24 ,  in  load_backend        return  import_module( '.base' , backend_name)     File  "/Library/Python/2.7/site-packages/django/utils/importlib.py" , line  35 ,  in  import_module       __import__(name)     File  "/Library/Python/2.7/site-packages/django/db/backends/mysql/base.py" , line  16 ,  in  <module>        raise  ImproperlyConfigured( "Error loading MySQLdb module: %s"  % e)   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      Referenced  from : /Library/Python/ 2.7 /site-packages/MySQL_python- 1.2 . 4b4 -py2. 7 -macosx- 10.7 -intel.egg/_mysql.so     Reason: image  not  found  

执行以下命令即可:

Shell代码  

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代码  

LANGUAGE_CODE =  'zh-cn'   

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

修改views.py,代码如下:

Python代码  

# Create your views here.    from  django.shortcuts  import  render_to_response    from  entries.models  import  Category       def  categories_report(request):     listing = []      for  category_list  in  Category.objects.all():       category_dict = {}       category_dict[ 'item_object' ] = category_list       category_dict[ 'item_count' ] = category_list.entry_set.count()       category_dict[ 'item_name' ] = category_list.name      category_dict[ 'item_published' ] = category_list.entry_set.filter(published= True ).count()       category_dict[ 'percent_published' ] = int(float(category_dict[ 'item_published' ]) / category_dict[ 'item_count' ] *  100 )       listing.append(category_dict)      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代码  

<html>     <head>       <meta http-equiv= "Content-Type"  content= "text/html"  />       <title>统计列表</title>     </head>     <body>       <h1>统计列表</h1>    {%  for  category_dict  in  listing %}       <ul>         <li>分类: {{ category_dict.item_name }}</li>         <li>数目: {{ category_dict.item_count }}</li>         <li>已发布的数目: {{ category_dict.item_published }} ({{ category_dict.percent_published }}%)</li>       </ul>    {% endfor %}     </body>    </html>  

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

Python代码  

TEMPLATE_DIRS = (        # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".         # Always use forward slashes, even on Windows.         # Don't forget to use absolute paths, not relative paths.         './entries/templates' ,   )  

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

Python代码  

url(r '^report/$' ,  'entries.views.categories_report' ),  

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

blogs.rar  (9.3 KB) 下载次数: 4 MySQL-python-1.2.4b4.zip  (1.4 MB) 下载次数: 0

分享到:   

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 ...

Django LDAP  

0顶 0踩

CtripMySQLDBA   评论(0)   有79人浏览   2013-05-30 16:44

Django RequestContext

模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把u ...

python django  

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 ...

Django LDAP  

CtripMySQLDBA   评论(0)   有84人浏览   2013-05-30 16:44

Python——十年语言之冠

  英文原文:Python - language of the decade   最近我发现了这个 PYPL——编程语言流行指数。它对各种语言的流行指标进行了二次发掘。作者指出 TIOB ...

django python djangochina  

djangochina   评论(0)   有64人浏览   2013-05-22 15:16

Django RequestContext

模版中的变量由context中的值来替换,如果在多个页面模版中含有相同的变量,比如:每个页面都需要{{user}},笨办法就是在每个页面的请求视图中都把u ...

python django  

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 ...

django south  

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 ...

sqlite django python  

怡然城南   评论(0)   有123人浏览   2013-05-05 22:02

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

运行django出现 Error: [Errno 10013]的错误,是因为8000端口被占用了,我本地开了酷狗音乐,将它退出即可,或者是运行django时换一个端口即可。

python 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框架和服务器,所以在开�� ...

tornado nginx django  

sls0919   评论(0)   有66人浏览   2013-04-22 16:01

python django 服务器搭建

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

django python linux  

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 ...

django  

幽绿琵琶   评论(0)   有58人浏览   2013-04-08 15:21

django实例

django 实例

django  

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

ajax跨域访问(备忘)

老生常谈的问题,存此备忘: html5解决方案(老方案也有) server端解决方案 django修改response header

js Access-Control-Allow-Origin django html5

iyuan   评论(0)   有87人浏览   2013-03-22 15:00

PyCharm的Django设置截图

截图如下:

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 ...

python django pydev  

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 ...

python django  

jsntghf   评论(0)   有135人浏览   2013-02-21 15:46

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

在创建一个最简单的Django项目中,我们已经创建了一个项目的骨架,并能够正常访问,在这基础上,我们再接着来创建一个基于MVC的Django项目。   执行以下命令来创建一个entries模块: python manage.py startapp entries 至此,blogs项目中,包括以下部分: 其中,blogs目录包括以下几项: entries目录包括以下几项: 接下来 ...

python django mvc  

jsntghf   评论(0)   有439人浏览   2013-02-18 21:07

Django中静态文件设置方法

静态文件如CSS, javascript, 图片等文件在django中的配置官方文档写的比较模糊,自己通过实验验证后并整理如下,以防遗忘,目前只整理了关于本地开�� ...

django  

lanceverw   评论(0)   有174人浏览   2013-02-13 21:08

django教程写的好

http://djangobook.py3k.cn/2.0/ 超赞,拜读。 python的web框架不要太多... django、flask、bottle、tornado...

django  

polyahu   评论(0)   有168人浏览   2013-02-12 18:35

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

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

django csrf ajax json  

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于创建一个简单的基于MVC的Django项目的详细内容...

  阅读:61次