新博客地址:http://gorthon.sinaapp.com/
一个简单的wiki
查看:wiki的百度百科
以前的代码都在一起,没有发挥Django MTV的作用。
1. cd到newtest目录运行命令manage.py startapp wiki,产生一个名字叫wiki的目录,它含有4个文件:
__init__.py models.py tests.py views.py
2. models.py对应数据库的一些操作,添加代码如下:
from django.db import models # Create your models here. class wiki(models.Model): pagename = models.CharField(max_length = 20, unique = True) content = models.TextField()
首先要注意的事是每个数据模型都是 django.db.models.Model 的
子类。它的父类 Model 包含了所有必要的和数据库交互的方法,并提供了一个简洁漂亮的定义数据库字段的
语法。 这些就是我们需要编写的通过 Django存取基本数据的所有代码。
每个模型相当于单个数据库表,每个属性也是这个表中的一个字段。 属性名就是字段名,它的类型(例如
CharField )相当于数据库的字段类型 (例如 varchar )。
3. 让Django知道你的app(也就是安装app)
a) 修改settings.py 。查找INSTALLED_APPS(一般在settings.py的最下面),按照格式在末尾添加'newtest.wiki',
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'newtest.wiki', )
4. 创建数据库。cd到newtest目录运行命令manage.py syncdb,他会自动把models.py里面的数据“转换”到数据库。
5. 下面利用shell创建一个首页。命令manage.py shell进入python shell
>>> from newtest.wiki.models import wiki >>> page = wiki(pagename = 'Home', content = 'Welcome to Wiki.') >>> page.save()
6. 修改wiki目录下的view.py文件(这个文件其实就是叫法不同而已,和以前的helloworld.py,shoppinglist.py是一样的,只不过这样叫法以后容易维护。)
# _*_ coding:cp936 _*_ from django.models.wiki import wiki from django.core.template import loader, Context from django.utils.httpwrappers import HttpResponse, HttpResponseRedirect from django.core.extensions import render_to_response def index(request, pagename = ""): """显示正常页面,对页面的文字做特殊的链接处理""" if pagename: #查找是否已经存在页面 pages = wiki.get_list(pagename__exact = pagename) if pages: #存在则调用页面模板进行显示 return process('wiki/page.html', pages[0]) else: #不存在则进入编辑画面 return render_to_response('wiki/edit.html', {'pagename':pagename}) else: # 没提供页面的名字,则显示首页 page = wiki.get_object(pagename__exact='Home') return process('wiki/page.html', page) def edit(request, pagename): """显示编辑页面""" page = wiki.get_object(pagename__exact = pagename) return render_to_response('wiki/edit.html', {'pagename':pagename, 'content':page.content}) def save(request, pagename): """保存页面内容,老页面进行内容替换,新页面生成新记录""" content = request.POST['content'] pages = wiki.get_list(pagename__exact = pagename) if pages: pages[0].content = content pages[0].save() else: page = wiki.wiki(pagename = pagename, content = content) page.save() return HttpResponseRedirect("/wiki/%s" % pagename) import re r = re.compile(r'/b([A-Z][a-z]+[A-Z][a-z]+)/b') def process(template, page): """处理页面链接,并且将回车符转为<br>""" t = loader.get_template(template) content = r.sub(r'<a href="/wiki//1" mce_href="wiki//1">/1</a>', page.content) content = re.sub(r'[/n/r]+', '<br>', content) c = Context({'pagename':page.pagename, 'content':content}) return HttpResponse(t.render(c))
7. 创建newtest/templates/wiki文件夹,此文件夹下面新建page.html
<h2>{{ pagename }}</h2> <p>{{ content | safe }}</p> <p><form method="post" action="/wiki/{{ pagename }}/edit/"> <input type="submit" value="编辑"> </form></p>
创建edit.html
<h2>编辑:{{ pagename }}</h2> <form method="post" action="/wiki/{{ pagename }}/save/"> <textarea name="content" rows="10" cols="50">{{ content }}</textarea><br /> <input type="submit" value="保存"> </form>
8. urls.py映射添加:
(r'^wiki/$','newtest.wiki.views.index'),
(r'^wiki/(?P<pagename>/w+)/$','newtest.wiki.views.index'),
(r'^wiki/(?P<pagename>/w+)/edit/$','newtest.wiki.views.edit'),
(r'^wiki/(?P<pagename>/w+)/save/$','newtest.wiki.views.save'),
9. cd到newtest目录,运行命令manage.py runserver
10. 浏览器输入网址 http://127.0.0.1:8000/wiki