创建一个简单的基于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/即可看到列表了。
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项目的详细内容...