二. 编写借阅人
1. 新建借阅人package
在选中项目名称“library”右键,新建一个借阅人的package,如下图所示:
左键
输入包名称点解“Finish”。
2. 新建models
右键“reader”的package,新建一个“models.py”,如下图所示:
左键
输入“models”,点击“Finish”。
现在添加代码:
#!usr/bin/env python
#coding: utf-8
'''
Created on 2012-7-30
@author: jingwen.wu
'''
from django.db import models
class Reader(models.Model):
account = models.CharField(max_length = 64) #账号
name = models.CharField(max_length = 64) #姓名
email = models.CharField(max_length = 128) #邮箱
contact = models.IntegerField(max_length = 16) #联系方式
def __unicode__(self):
return self.account
新建方法如同新建“models.py”,代码如下:
#!usr/bin/env python
#coding: utf-8
'''
Created on 2012-7-30
@author: jingwen.wu
'''
from reader.models import Reader
from django.core.paginator import Paginator, InvalidPage, EmptyPage
from django.http import HttpResponse
from django.utils import simplejson
from django.shortcuts import render_to_response, get_object_or_404
'''显示借阅人列表'''
def index(request):
readers = Reader.objects.order_by('account')
paginator = Paginator(readers, 10) #每页显示的行数
page = request.POST.get('pageNum', 1)
try:
if int(page) > paginator.num_pages:
page = str(paginator.num_pages)
readers = paginator.page(page)
except (EmptyPage, InvalidPage):
readers = paginator.page(paginator.num_pages)
return render_to_response('reader/basepage.html', {'readers':readers, 'currentPage':page, 'numPerPage':5})
'''添加借阅人信息'''
def addReader(request):
if request.POST:
account = request.POST.get('account', None)
name = request.POST.get('name', None)
email = request.POST.get('email', None)
contact = request.POST.get('contact', None)
'''验证借阅人是否已经存在'''
readers = Reader.objects.filter(account__iexact = account)
if readers:
return HttpResponse(simplejson.dumps({"status":201, "statusCode":201, "navTabId":request.POST.get('navTabId', 'readerindex'), "callbackType":request.POST.get('callbackType', None), "message":u'此账户已存在不能重复添加', "info":u'此账户已存在不能重复添加', "result":u'此账户已存在不能重复添加'}), mimetype='application/json')
else:
reader = Reader(account=account, name=name, email=email, contact=contact)
reader.save()
return HttpResponse(simplejson.dumps({"statusCode":200, "navTabId":request.POST.get('navTabId', 'readerindex'), "callbackType":request.POST.get('callbackType', 'closeCurrent'), "message":u'添加成功'}), mimetype='application/json')
return render_to_response('reader/add.html')
'''编辑借阅人信息'''
def editReader(request, id):
reader = get_object_or_404(Reader, pk = int(id))
if request.POST:
reader.name = request.POST.get('name', None)
reader.email = request.POST.get('email', None)
reader.contact = request.POST.get('contact', None)
reader.save()
return HttpResponse(simplejson.dumps({"statusCode":200, "navTabId":request.POST.get('navTabId', 'readerindex'), "callbackType":request.POST.get('callbackType', 'closeCurrent'), "menssage":u'编辑成功', "info":u'编辑成功', "result":u'编辑成功'}), mimetype='application/json')
return render_to_response('reader/edit.html', {'reader': reader})
'''删除借阅人信息'''
def delReader(request, id):
reader = Reader.objects.get(id = id)
reader.delete()
return HttpResponse(simplejson.dumps({"statusCode":200, "navTabId":request.POST.get('navTabId', 'readerindex'), "callbackType":request.POST.get('callbackType', None), "message":u'删除成功', "info":u'删除成功', "result":u'删除成功'}), mimetype='application/json')
'''批量删除借阅人信息'''
def selecteddelReader(request):
ids = request.POST.get('ids', None)
if ids:
readers = Reader.objects.extra( where=['id IN (' + ids + ')'] )
readers.delete()
return HttpResponse(simplejson.dumps({"statusCode":200, "navTabId":request.POST.get('navTabId', 'readerindex'), "callbackType":request.POST.get('callbackType', None), "message":u'删除成功', "info":u'删除成功', "result":u'删除成功'}), mimetype='application/json')
'''查询借阅人信息'''
def searchReader(request):
if 'q' in request.POST and request.POST['q']:
q = request.POST['q']
readers = Reader.objects.filter(name__icontains = q)
else:
readers = Reader.objects.order_by('name')
paginator = Paginator(readers, 10)
page = request.POST.get('pageNum', 1)
try:
if int(page) > paginator.num_pages:
page = str(paginator.num_pages)
readers = paginator.page(page)
except(EmptyPage, InvalidPage):
readers = paginator.page(paginator.num_pages)
if 'q' in request.POST and request.POST['q']:
return render_to_response('reader/basepage.html', {'readers':readers, 'currentPage':page, 'numPerPage':5, 'q':q})
else:
return render_to_response('reader/basepage.html', {'readers':readers, 'currentPage':page, 'numPerPage':5})
4,新建“urls.py”
代码如下:
#!usr/bin/env python
#coding: utf-8
'''
Created on 2012-7-30
@author: jingwen.wu
'''
from django.conf.urls.defaults import *
from django.conf import settings
urlpatterns = patterns('',
url(r'^$', 'reader.views.index',name="readers_index"),
url(r'^index/$', 'reader.views.index', name="readers_index"),
url(r'^add/$', 'reader.views.addReader',name="readers_add"),
url(r'^edit/(?P<id>\d+)/$', 'reader.views.editReader',name="readers_edit"),
url(r'^delete/(?P<id>\d+)/$', 'reader.views.delReader',name="readers_delete"),
url(r'^selecteddelete/$', 'reader.views.selecteddelReader',name="readers_selecteddelete"),
url(r'^search/$', 'reader.views.searchReader',name="readers_search"),
)
其中,url()的第一个参数是正则表达式。“r”标明在正则表达式中“\”不为转义符。
5. 前台界面
现在来添加前台界面,界面用DWZ富客户端框架展示。前台界面用总过三个界面,总览的基础页、添加页和编辑页。
右键项目名称“library”,添加文件夹“templates”,如下图所示:
左键
输入文件夹名称“templates”,点击“Finish”。
右键文件夹“templates”,添加文件夹“reader”。
右键文件夹“reader”,添加基础页的.html文件,如下图所示:
点击
输入页面名称“basepage.html”,点击“Finish”。
编写“basepage.html”时应以“Text Editor”方式打开。一般默认以“Web Browser”方式。
添加代码如下:
<form id="pagerForm" action="{% url readers_index %}" method="post">
<input type="hidden" name="pageNum" value="{{ currentPage }}"/>
<input type="hidden" name="numPerPage" value="{{ numPerPage }}"/>
<input type="hidden" name="account" value=""/>
</form>
<script type="text/javascript">
if(typeof(dwzinit)=='undefined') {
self.location="/"
}
</script>
<div class="page">
<div class="pageHeader">
<form οnsubmit="return navTabSearch(this);" action="{% url readers_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 readers_add %}" target="dialog" mask="true" width="600" height="400" title="添加借阅人" rel="addresource"><span>新增</span></a></li>
<li><a title="确实要删除这些记录吗?" target="selectedTodo" rel="ids" postType="string" href="{% url readers_selecteddelete %}" class="delete"><span>批量删除</span></a></li>
<li class="line">line</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="15%">账号</th>
<th width="15%">姓名</th>
<th width="25%">邮箱</th>
<th width="15%">联系电话</th>
<th width="27%">操作</th>
</tr>
</thead>
<tbody>
{% for reader in readers.object_list %}
<tr target="sid_group" rel="{{ reader.id }}">
<td><input name="ids" value="{{ reader.id }}" type="checkbox"></td>
{% load common_tags %}
<td>{{ forloop.counter|calculate:currentPage }}</td>
<td>{{ reader.account }}</td>
<td>{{ reader.name }}</td>
<td>{{ reader.email }}</td>
<td>{{ reader.contact }}</td>
<td>
<a class="edit" href="{% url readers_edit reader.id %}" target="dialog" mask="true" width="600" height="400" rel="editresource"><span>编辑</span></a>
<a class="delete" href="{% url readers_delete reader.id %}" target="ajaxTodo" rel="deleteres" title="您确定要删除该项吗?"><span>删除</span></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="panelBar">
<div class="pages">
<span>共{{ readers.paginator.count }}条</span>
</div>
<div class="pagination" targetType="navTab" totalCount="{{ readers.paginator.count }}" numPerPage="{{ readers.paginator.per_page }}" pageNumShown="10" currentPage="{{ currentPage }}"></div>
</div>
</div>
</div>
其中,“action”的内容指向之前“urls”中设置的匹配关系;“calculate”是一个过滤器,用于翻页后“序号”依然能够依序递增,会在之后详细介绍。
再添加添加页“add.html”的代码如下:
<div class="page">
<div class="pageContent">
<form method="post" action="{% url readers_add %}" class="pageForm required-validate" οnsubmit="return validateCallback(this, dialogAjaxDone)">{% csrf_token %}
<input type="hidden" name="navTabId" value="readerindex"/>
<div class="pageFormContent" layoutH="58">
<div class="unit">
<label>账号:</label>
<input type="text" class="required" size="30" name="account" value="" />
</div>
<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 email" size="30" name="email" value="" />
</div>
<div class="unit">
<label>联系电话:</label>
<input type="text" class="required" size="30" name="contact" value="" />
</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>
添加“edit.html”的代码如下:
<div class="page">
<div class="pageContent">
<form method="post" action="{% url readers_edit reader.id %}" class="pageForm required-validate" οnsubmit="return validateCallback(this, dialogAjaxDone)">
<input type="hidden" name="navTabId" value="readerindex"/>
<div class="pageFormContent" layoutH="58">
<div class="unit">
<label>账号:</label>
<input type="text" class="required" size="30" name="account" value="{{ reader.account }}" readonly="readonly" />
</div>
<div class="unit">
<label>姓名:</label>
<input type="text" size="30" name="name" value="{{ reader.name }}" />
</div>
<div class="unit">
<label>邮箱:</label>
<input type="text" class="required email" size="30" name="email" value="{{ reader.email }}" />
</div>
<div class="unit">
<label>联系电话:</label>
<input type="text" class="required phone" size="30" name="contact" value="{{ reader.contact }}" />
</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>
“edit.html”的代码和“add.html”的代码很相似,只是修改了“action”的指向,再给每个“value”添加了变量,这样可以在修改信息时看到已有信息的内容。