Django 一个简单的图书管理程序(四 编写图书管理)

来源:互联网 发布:scrivener 注册机 mac 编辑:程序博客网 时间:2024/05/17 01:44

现在在已有的框架中添加图书管理。

右键项目名称“library”,新建包“book”。

1. 新建“models.py”

右键包名“book”,新建“models.py”,代码如下:

#!usr/bin/env python#coding: utf-8'''Created on 2012-7-30@author: jingwen.wu'''from django.db import modelsfrom reader.models import Readerclass Book(models.Model):    name = models.CharField(max_length = 128)   #书名    press = models.CharField(max_length = 128, blank = True)  #出版社    author = models.CharField(max_length = 64, blank = True)    #作者    publicationTime = models.DateTimeField(blank = True)    #出版时间        reader = models.ForeignKey(Reader, blank = True)  #借阅人员        def __unicode__(self):        return self.name        
借阅人作为外键被引用。

2. 新建“views.py”

右键包名“book”,新建“views.py”,代码如下:

#!usr/bin/env python#coding: utf-8'''Created on 2012-7-30@author: jingwen.wu'''from book.models import Bookfrom reader.models import Readerfrom django.core.paginator import Paginator, InvalidPage, EmptyPagefrom django.shortcuts import render_to_response, get_object_or_404from django.http import HttpResponsefrom django.utils import simplejsonfrom django.template import RequestContextdef index(request):        books = Book.objects.order_by('name')    paginator = Paginator(books, 10)    # 每页显示数目    page = request.POST.get('pageNum', 1)    try:        if int(page) > paginator.num_pages:            page = str(paginator.num_pages)        books = paginator.page(page)    except (EmptyPage, InvalidPage):        books = paginator.page(paginator.num_pages)    return render_to_response('book/basepage.html', {'books':books, 'currentPage':page, 'numPerPager':5})def addBook(request):        if request.POST:                name = request.POST.get('name', None)        press = request.POST.get('press', None)        author = request.POST.get('author', None)        publicationTime = request.POST.get('publicationTime', None)                '''验证是否有重复的书名'''        names = Book.objects.filter(name__iexact = name)        if names:            return HttpResponse(simplejson.dumps({"status":201, "statusCode":201, "navTabId":request.POST.get('navTabId', 'bookindex'), "callbackType":request.POST.get('callbackType', None), "message":u'此书名已经存在不能重复添加', "info":u'此书名已经存在不能重复添加', "result":u'此书名已经存在不能重复添加'}), mimetype='application/json')        else:            book = Book(name=name, press=press, author=author, publicationTime=publicationTime)            book.save()            return HttpResponse(simplejson.dumps({"statusCode":200, "navTabId":request.POST.get('navTabId', 'bookindex'), "callbackType":request.POST.get('callbackType', 'closeCurrent'), "message":u'添加成功'}), mimetype='application/json')    return render_to_response('book/add.html')        def editBook(request, id):        book = get_object_or_404(Book, pk=int(id))  # 404:服务器找不到指定的资源    if request.POST:        book.name = request.POST.get('name', None)        book.press = request.POST.get('press', None)        book.author = request.POST.get('author', None)        book.publicationTime = request.POST.get('publicationTime', None)        book.reader = request.POST.get('reader', None)        book.save()        return HttpResponse(simplejson.dumps({"statusCode":200, "navTabId":request.POST.get('navTabId', 'bookindex'), "callbackType":request.POST.get('callbackType', 'closeCurrent'), "message":u'编辑书本信息成功', "info":u'编辑书本信息成功'}), mimetype='application/json')    return render_to_response('book/edit.html', {'book': book})def delBook(request, id):        book = Book.objects.get( id = id )    book.delete()    return HttpResponse(simplejson.dumps({"statusCode":200, "nabTabId":request.POST.get('navTabId', 'bookindex'), "callbackType":request.POST.get('callbackType', None), "message":u'删除成功', "info":u'删除成功', "result":u'删除成功'}), mimetype='application/json')def selecteddelBook(request):        ids = request.POST.get('ids', None)    if ids:        books = Book.objects.extra( where=['id IN (' + ids + ')'])        books.delete()        return HttpResponse(simplejson.dumps({"statusCode":200, "navTabId":request.POST.get('navTabId', 'bookindex'), "callbackType":request.POST.get('callbackType', None), "message":u'删除成功', "info":u'删除成功', "result":u'删除成功'}), mimetype='application/json')def searchBook(request):         if 'q' in request.POST and request.POST['q']:        q = request.POST['q']        books = Book.objects.filter(name__icontains = q)    else:        books = Book.objects.order_by('name')            paginator = Paginator(books, 10)    page = request.POST.get('pageNum', 1)    try:        if int(page) > paginator.num_pages:            page = str(paginator.num_pages)        books = paginator.page(page)    except (EmptyPage, InvalidPage):        books = paginator.page(paginator.num_pages)    if 'q' in request.POST and request.POST['q']:        return render_to_response('book/basepage.html', {'books':books, 'currentPage':page, 'numPerPage':5, 'q':q})    else:        return render_to_response('book/basepage.html', {'books':books, 'currentPage':page, 'numPerPage':5})    

3. 新建“urls.py”

右键包名“book”,新建“urls.py”,代码如下:

#!usr/bin/env python#coding: utf-8'''Created on 2012-7-30@author: jingwen.wu'''from django.conf.urls.defaults import url, patternsfrom django.conf import settingsurlpatterns = patterns('',    url(r'^$', 'book.views.index',name="books_index"),    url(r'^index/$', 'book.views.index', name="books_index"),    url(r'^add/$', 'book.views.addBook',name="books_add"),    url(r'^edit/(?P<id>\d+)/$', 'book.views.editBook',name="books_edit"),    url(r'^delete/(?P<id>\d+)/$', 'book.views.delBook',name="books_delete"),    url(r'^selecteddelete/$', 'book.views.selecteddelBook',name="books_selecteddelete"),    url(r'^search/$', 'book.views.searchBook',name="books_search"),  )


4. 编写界面

右键文件夹“templates”,新建文件夹“book”

4.1. 新建“basepage.html”

右键文件夹“book”, 新建“basepages.html”,代码如下:

<form id="pagerForm" action="{% url books_index %}" method="post"><input type="hidden", name="pageNum" value="{{ currentPage }}"/><input type="hidden", name="numPerPage" value="{{ numPerPage }}"/><input type="hidden", name="numPerPage" value=""/></form><script type="text/javascript">if(typeof(dwzinit)=='undefined'){self.location="/"}</script><div class="page"><div class="pageHeader"><form onsubmit="return navTabSearch(this);" action="{% url books_search %}" method="post"><div class="searchBar"><table class="searchContent"><tr><td >图书名称:<input type="text" name="q" value="{{ q }}"/></td><td ><div class="buttonActive"><div class="buttonContent"><button type="submit">检索</button></div></div></td></tr></table></div></form></div><div class="pageContent"><div class="panelBar"><ul class="toolBar"><li><a class="add" href="{% url books_add %}" target="dialog" mask="true" width="600", height="400", title="添加图书" rel="addresource"><span>新增</span></a></li><li><a class="delete" title="确实要删除这些记录吗?" target="selectedTodo" rel="ids" postType="string" href="{% url books_selecteddelete %}" ><span>批量删除</span></a></li></ul></div><table class="table" width="100%" layoutH="116"><thead><tr><th width="3%"><input type="checkbox" group="ids" class="checkboxCtrl"></th><th width="5%">序号</th><th width="25%">名称</th><th width="15%">作者</th><th width="20%">出版社</th><th width="10%">出版时间</th><th width="10%">借阅人</th><th width="10%">操作</th></tr></thead><tbody>{% for book in books.object_list %}<tr target="sid_group" rel="{{ book.id }}"><td><input name="ids" value="{{ book.id }}" type="checkbox"/></td>{% load common_tags %}<td>{{ forloop.counter|calculate:currentPage}}</td><td>{{ book.name }}</td><td>{{ book.author }}</td><td>{{ book.press }}</td><td>{{ book.publicationTime|date:"Y-m-d" }}</td><td>{{ book.reader.name}}</td><td><a class="edit" href="{% url books_edit book.id %}" target="dialog" mask="true" width="720" height="500" rel="editresource"><span>编辑</span></a><a class="delete" href="{% url books_delete book.id %}" target="ajaxTodo" rel="deleteresource" title="确定要删除该项吗?"><span>删除</span></a></td></tr>{% endfor %}</tbody></table><div class="panelBar"><div class="pages"><span>共{{ books.paginator.count }}</span></div><div class="pagination" targetType="navTab" totalCount="{{ books.paginator.count }}" numPerPage="{{ books.paginator.per_page }}" pageNumShown="10" currentPage="{{ currentPage }}"></div></div></div></div>

4.2. 新建“add.html”

右键文件夹“book”,新建“add.html”,代码如下:

<div class="page"><div class="pageContent"><form method="post" action="{% url books_add %}" class="pageForm required-validate" onsubmit="return validateCallback(this, dialogAjaxDone)">{% csrf_token %}<input type="hidden" name="navTabId" value="bookindex"/><div class="pageFormContent" layoutH="58"><div class="unit"><label>名称:</label><input type="text" class="required" size="30" name="name" value=""/></div><div class="unit"><label>作者:</label><input type="text" class="required" size="30" name="author" value=""/></div><div class="unit"><label>出版社:</label><input type="text" class="required" size="30" name="press" value=""/></div><div class="unit"><label>出版时间:</label><input type="text" name="publicationTime" class="date" size="30" format="yyyy-MM-dd" readonly="true" yearstart="-100" yearend="200" /><a class="inputDateButton" href="javascript:;">选择</a><span class="info">yyyy-MM-dd</span></div><div class="formBar"><ul><li><div class="buttonActive"><div class="buttonContent"><button type="submit">保存</button></div></div></li><li><div class="button"><div class="buttonContent"><button type="button" class="close">取消</button></div></div></li></ul></div></div></form></div></div>

4.3. 新建“edit.html”

右键文件夹“book”,新建“edit.html”,代码如下:

<div class="page"><div class="pageContent"><form method="post" avtion="{% url books_edit %}" class="pageForm required-validate" onsubmit="reture validateCallback(this, dialogAjaxDone)"><input type="hidden" name="nabTabId" value="bookindex"/><div class="pageFormContent" layoutH="58"><div class="unit"><label>名称:</label><input type="text" class="required" size="30" name="name" value="{{ book.name }}" readonly="readonly" /></div><div class="unit"><label>作者:</label><input type="text" class="required" size="30" name="author" value="{{ book.author }}" readonly="readonly"/></div><div class="unit"><label>出版社:</label><input type="text" class="required" size="30" name="press" value="{{ book.press }}" readonly="readonly"/></div><div class="unit"><label>出版时间:</label><input type="text" name="publicationTime" class="date" size="30" format="yyyy-MM-dd" readonly="true" value='{{ book.publicationTime|date:"Y-m-d" }}' yearstart="-10" yearend="20" readonly="readonly"/><span class="info">年-月-日</span></div><div><label>借阅人</label><input type="text" class="required" size="30" name="reader" value="{{ book.reader.name}}"/></div></div><div class="formBar"><ul><li><div class="buttonActive"><div class="buttonContent"><button type="submit">保存</button></div></div></li><li><div class="button"><div class="buttonContent"><button type="button" class="close">取消</button></div></div></li></ul></div></form></div></div>

4.4. 新建“nav_book.html”

在页面左上方添加图书的快捷导航键, 连接到“nav_book.html”。右键文件夹“commmon”,新建“nav_book.html”代码如下:

<script type="text/javascript">navTab.openTab("bookindex", "{% url books_index %}", {title:"图书管理"});</script><div class="accordion" fillSpace="sidebar"><div class="accordionHeader"><h2><span>Folder</span>系统管理</h2></div><div class="accordionContent"><ul class="tree treeFolder expand"><li><a>常用操作</a><ul><li><a class="add" href="{% url books_add %}" target="dialog" mask="true" width="600" height="400" title="添加图书" rel="addbook"><span>添加图书</span></a></li><li><a class="add" href="{% url readers_add %}" target="dialog" mask="true" width="600" height="400" title="添加借阅人" rel="addreader"><span>添加借阅人</span></a></li></ul></li><li><a>图书管理</a><ul><li><a href="{% url books_index %}" target="navTab" rel="bookindex" title="图书管理">图书管理</a></li></ul></li></ul></div></div>

在“library/common/views.py”中添加代码:

def nav_book(request):    return render_to_response('common/nav_book.html', {}, context_instance=RequestContext(request))

在“library/common/urls.py”中的“urlpatterns = patterns()”添加代码:

url(r'^nav_book/$', 'common.views.nav_book', name="common_book"),

在“library/templates/common/index.html”的“id = "navMenu" ”里添加:

<li><a href="{% url common_book %}"><span>图书管理</span></a></li>

“library/templates/common/index.html”的“常用操作”里添加:

<li><a class="add" href="{% url books_add %}" target="dialog" mask="true" width="600" height="400" title="添加图书" rel="addbook"><span>添加图书</span></a></li>

“library/templates/common/index.html”的“系统操作”里添加:

<li><a href="{% url books_index %}" target="navTab" rel="bookindex" title="图书管理" >图书管理</a></li>

5. 修改“setting”

在“library/library/setting.py”的“INSTALLED_APPS = ()”中添加“'book',”

6. 同步数据库

7. 运行

首页:


添加:

图书管理: