Django 一个简单的图书管理程序 (三 展示)

之前创建了项目,编写的借阅者的一些操作。现在尝试着添加主页,通过浏览器展示这些操作。

1. 添加网页展示的信息

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

右键包名“static”,新建文件夹“static”。

在文件夹“static”中添加网页展示风格的一些信息。也可以在http://code.google.com/p/dwz/downloads/list下载,使用dwz的一些风格。


2. 新建对主页的操作

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

2.1. 新建“views.py”

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

[python]  view plain copy
  1. #!usr/bin/env python  
  2. #coding: utf-8  
  3. ''''' 
  4. Created on 2012-8-3 
  5.  
  6. @author: jingwen.wu 
  7. '''  
  8. from django.shortcuts import render_to_response,get_object_or_404  
  9. from django.template import RequestContext  
  10. from django.http import HttpResponseRedirect  
  11. from django.core.urlresolvers import reverse  
  12. from django.contrib.auth.decorators import login_required  
  13.   
  14. def index(request):  
  15.     return render_to_response('common/index.html', context_instance=RequestContext(request))  
  16.   
  17. def nav_index(request):  
  18.     return render_to_response('common/nav_index.html', {}, context_instance=RequestContext(request))  
  19.   
  20. def nav_reader(request):  
  21.     return render_to_response('common/nav_reader.html', {}, context_instance=RequestContext(request))  


2.2. 新建“urls.py”

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

[python]  view plain copy
  1. #!usr/bin/env python  
  2. #coding: utf-8  
  3.   
  4. ''''' 
  5. Created on 2012-8-3 
  6.  
  7. @author: jingwen.wu 
  8. '''  
  9.   
  10. from django.conf.urls.defaults import *  
  11. from django.conf import settings  
  12.   
  13. urlpatterns = patterns('',  
  14.     url(r'^$''common.views.index',name="index"),  
  15.     url(r'^nav_index/$''common.views.nav_index', name="common_index"),  
  16.     url(r'^nav_reader/$''common.views.nav_reader', name="common_reader"),  
  17. )  


2.3. 新建过滤器

右键包名“common”,新建包“templatetags”,右键“templatetags”,新建“common_tags.py”,代码如下:

[python]  view plain copy
  1. "font-size:18px;">#!usr/bin/env python  
  2. #coding: utf-8  
  3. from django import template  
  4. register = template.Library()  
  5.  
  6. @register.filter(name='calculate')  
  7. def calculate(value, arg):  
  8.     return (int(arg)-1)*10 + int(value)  
  9.   
  10.   
此过滤器用于页面展示的“序号”能够在翻页后依然依序递增。页面引用如下:


其中,“currentPage”为当前页码。

3. 设置“library” 的“setting”和“urls”

修改“library/library/setting.py”如下:

[python]  view plain copy
  1. "font-size:18px;"># Django settings for library project.  
  2.   
  3. import os.path  
  4.   
  5. DEBUG = True  
  6. TEMPLATE_DEBUG = DEBUG  
  7. HERE = os.path.dirname(os.path.dirname(__file__))  
  8.   
  9. ADMINS = (  
  10.     # ('Your Name', '[email protected]'),  
  11. )  
  12.   
  13. MANAGERS = ADMINS  
  14.   
  15. DATABASES = {  
  16.     'default': {  
  17.         'ENGINE''django.db.backends.mysql'# Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.  
  18.         'NAME''library',                      # Or path to database file if using sqlite3.  
  19.         'USER''root',                      # Not used with sqlite3.  
  20.         'PASSWORD''mysql',                  # Not used with sqlite3.  
  21.         'HOST''localhost',                      # Set to empty string for localhost. Not used with sqlite3.  
  22.         'PORT''3306',                      # Set to empty string for default. Not used with sqlite3.  
  23.     }  
  24. }  
  25.   
  26. # Local time zone for this installation. Choices can be found here:  
  27. # http://en.wikipedia.org/wiki/List_of_tz_zones_by_name  
  28. # although not all choices may be available on all operating systems.  
  29. # On Unix systems, a value of None will cause Django to use the same  
  30. # timezone as the operating system.  
  31. # If running in a Windows environment this must be set to the same as your  
  32. # system time zone.  
  33. TIME_ZONE = 'Asia/Shanghai'  
  34.   
  35. # Language code for this installation. All choices can be found here:  
  36. # http://www.i18nguy.com/unicode/language-identifiers.html  
  37. LANGUAGE_CODE = 'zh-cn'  
  38.   
  39. SITE_ID = 1  
  40.   
  41. # If you set this to False, Django will make some optimizations so as not  
  42. # to load the internationalization machinery.  
  43. USE_I18N = True  
  44.   
  45. # If you set this to False, Django will not format dates, numbers and  
  46. # calendars according to the current locale.  
  47. USE_L10N = True  
  48.   
  49. # If you set this to False, Django will not use timezone-aware datetimes.  
  50. USE_TZ = True  
  51.   
  52. # Absolute filesystem path to the directory that will hold user-uploaded files.  
  53. # Example: "/home/media/media.lawrence.com/media/"  
  54. MEDIA_ROOT = os.path.join(HERE, 'media').replace('\\','/')  
  55.   
  56. # URL that handles the media served from MEDIA_ROOT. Make sure to use a  
  57. # trailing slash.  
  58. # Examples: "http://media.lawrence.com/media/", "http://example.com/media/"  
  59. MEDIA_URL = '/media/'  
  60.   
  61. # Absolute path to the directory static files should be collected to.  
  62. # Don't put anything in this directory yourself; store your static files  
  63. # in apps' "static/" subdirectories and in STATICFILES_DIRS.  
  64. # Example: "/home/media/media.lawrence.com/static/"  
  65. STATIC_ROOT = os.path.join(HERE, 'static').replace('\\','/')  
  66.   
  67. # URL prefix for static files.  
  68. # Example: "http://media.lawrence.com/static/"  
  69. STATIC_URL = '/static/'  
  70.   
  71. ADMIN_MEDIA_ROOT = '/static/admin/'  
  72.   
  73. # Additional locations of static files  
  74. STATICFILES_DIRS = (  
  75.     # Put strings here, like "/home/html/static" or "C:/www/django/static".  
  76.     # Always use forward slashes, even on Windows.  
  77.     # Don't forget to use absolute paths, not relative paths.  
  78.     os.path.join(HERE,'static/static/').replace('\\','/'),  
  79. )  
  80.   
  81. # List of finder classes that know how to find static files in  
  82. # various locations.  
  83. STATICFILES_FINDERS = (  
  84.     'django.contrib.staticfiles.finders.FileSystemFinder',  
  85.     'django.contrib.staticfiles.finders.AppDirectoriesFinder',  
  86. #    'django.contrib.staticfiles.finders.DefaultStorageFinder',  
  87. )  
  88.   
  89. # Make this unique, and don't share it with anybody.  
  90. SECRET_KEY = 'jlf4edatvxmm$*o)mfi=1cz_(vr21+32w(ak8_yac4*mxl8g%a'  
  91.   
  92. # List of callables that know how to import templates from various sources.  
  93. TEMPLATE_LOADERS = (  
  94.     'django.template.loaders.filesystem.Loader',  
  95.     'django.template.loaders.app_directories.Loader',  
  96. #     'django.template.loaders.eggs.Loader',  
  97. )  
  98.   
  99. MIDDLEWARE_CLASSES = (  
  100.     'django.middleware.common.CommonMiddleware',  
  101.     'django.contrib.sessions.middleware.SessionMiddleware',  
  102.     'django.middleware.csrf.CsrfViewMiddleware',  
  103.     'django.contrib.auth.middleware.AuthenticationMiddleware',  
  104.     'django.contrib.messages.middleware.MessageMiddleware',  
  105.     # Uncomment the next line for simple clickjacking protection:  
  106.     # 'django.middleware.clickjacking.XFrameOptionsMiddleware',  
  107. )  
  108.   
  109. ROOT_URLCONF = 'library.urls'  
  110.   
  111. # Python dotted path to the WSGI application used by Django's runserver.  
  112. WSGI_APPLICATION = 'library.wsgi.application'  
  113.   
  114. TEMPLATE_DIRS = (  
  115.     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".  
  116.     # Always use forward slashes, even on Windows.  
  117.     # Don't forget to use absolute paths, not relative paths.  
  118.     os.path.join(HERE,'templates'),  
  119. )  
  120.   
  121. INSTALLED_APPS = (  
  122.     'django.contrib.auth',  
  123.     'django.contrib.contenttypes',  
  124.     'django.contrib.sessions',  
  125.     'django.contrib.sites',  
  126.     'django.contrib.messages',  
  127.     'django.contrib.staticfiles',  
  128.     # Uncomment the next line to enable the admin:  
  129.     # 'django.contrib.admin',  
  130.     # Uncomment the next line to enable admin documentation:  
  131.     # 'django.contrib.admindocs',  
  132.     'common',  
  133.     'reader',  
  134. )  
  135.   
  136. # A sample logging configuration. The only tangible logging  
  137. # performed by this configuration is to send an email to  
  138. # the site admins on every HTTP 500 error when DEBUG=False.  
  139. # See http://docs.djangoproject.com/en/dev/topics/logging for  
  140. # more details on how to customize your logging configuration.  
  141. LOGGING = {  
  142.     'version'1,  
  143.     'disable_existing_loggers'False,  
  144.     'filters': {  
  145.         'require_debug_false': {  
  146.             '()''django.utils.log.RequireDebugFalse'  
  147.         }  
  148.     },  
  149.     'handlers': {  
  150.         'mail_admins': {  
  151.             'level''ERROR',  
  152.             'filters': ['require_debug_false'],  
  153.             'class''django.utils.log.AdminEmailHandler'  
  154.         }  
  155.     },  
  156.     'loggers': {  
  157.         'django.request': {  
  158.             'handlers': ['mail_admins'],  
  159.             'level''ERROR',  
  160.             'propagate'True,  
  161.         },  
  162.     }  
  163. }  
  164.   
  165. from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS  
  166. TEMPLATE_CONTEXT_PROCESSORS += (  
  167.     'django.core.context_processors.request',  
  168. )  
  169.   


修改“library/library/urls.py”如下:

[python]  view plain copy
  1. "font-size:18px;">from django.conf.urls import patterns, include, url  
  2. from django.conf import settings  
  3. from django.conf.urls.static import static  
  4.   
  5. # Uncomment the next two lines to enable the admin:  
  6. from django.contrib import admin  
  7. admin.autodiscover()  
  8.   
  9. urlpatterns = patterns('',  
  10.     # Examples:  
  11.     # url(r'^$', 'library.views.home', name='home'),  
  12.     # url(r'^library/', include('library.foo.urls')),  
  13.   
  14.     # Uncomment the admin/doc line below to enable admin documentation:  
  15.     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),  
  16.   
  17.     # Uncomment the next line to enable the admin:  
  18.     # url(r'^admin/', include(admin.site.urls)),  
  19.     url(r'^$''common.views.index',name="index"),  
  20.     url(r'^common/', include('common.urls')),  
  21.     url(r'^reader/', include('reader.urls')),      
  22. )  
  23.   
  24. urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)  
  25. urlpatterns += static(settings.STATIC_URL, document_root = settings.STATIC_ROOT)  

4. 新建主页

简单修改dwz的主页信息。

右键文件夹“templates”,新建文件夹“common”。

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

[html]  view plain copy
  1. <span style="font-size:18px;">>  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <meta http-equiv="X-UA-Compatible" content="IE=7" />  
  6. <title>图书管理系统title>  
  7. {% load static %}  
  8. <link href="{% get_static_prefix %}js/dwz/themes/default/style.css" rel="stylesheet" type="text/css" />  
  9. <link href="{% get_static_prefix %}js/dwz/themes/css/core.css" rel="stylesheet" type="text/css" />  
  10. <link href="{% get_static_prefix %}js/dwz/themes/css/print.css" rel="stylesheet" type="text/css" />  
  11. <link href="{% get_static_prefix %}js/dwz/uploadify/css/uploadify.css" rel="stylesheet" type="text/css" />  
  12.   
  13. <script src="{% get_static_prefix %}js/dwz/javascripts/dwz.regional.zh.js" type="text/javascript">script>  
  14.   
  15.   
  16. <script type="text/javascript">  
  17. //标识dwz是否初始化  
  18. dwzinit = true;  
  19.   
  20. function fleshVerify(){  
  21.     //重载验证码  
  22.     $('#verifyImg').attr("src", '__APP__/Public/verify/'+new Date().getTime());  
  23. }  
  24. function dialogAjaxMenu(json){  
  25.     dialogAjaxDone(json);  
  26.     if (json.statusCode == DWZ.statusCode.ok){  
  27.         //$("#sidebar").loadUrl("__APP__/Public/menu");  
  28.     }  
  29. }  
  30. function navTabAjaxMenu(json){  
  31.     navTabAjaxDone(json);  
  32.     if (json.statusCode == DWZ.statusCode.ok){  
  33.         //$("#sidebar").loadUrl("__APP__/Public/menu");  
  34.     }  
  35. }  
  36. $(function(){  
  37.     DWZ.init("{% get_static_prefix %}js/dwz/dwz.frag.xml", {  
  38.         loginUrl:"login_dialog.html", loginTitle:"登录",  // 弹出登录对话框  
  39. //      loginUrl:"login.html",  // 跳到登录页面  
  40.         statusCode:{ok:200, error:300, timeout:301}, //【可选】  
  41.         pageInfo:{pageNum:"pageNum", numPerPage:"numPerPage", orderField:"orderField", orderDirection:"orderDirection"}, //【可选】  
  42.         debug:false,    // 调试模式 【true|false】  
  43.         callback:function(){  
  44.             initEnv();  
  45.             $("#themeList").theme({themeBase:"{% get_static_prefix %}js/dwz/themes"}); // themeBase 相对于index页面的主题base路径  
  46.             //$("#sidebar").loadUrl("__APP__/Public/menu");  
  47.                         //initUI();  
  48.         }  
  49.     });  
  50. });  
  51.   
  52.   
  53. //清理浏览器内存,只对IE起效,FF不需要  
  54. if ($.browser.msie) {  
  55.     window.setInterval("CollectGarbage();", 10000);  
  56. }  
  57.   
  58.   
  59. //新加处理ajax提交表单的处理方式  
  60. jQuery(document).ajaxSend(function(event, xhr, settings) {  
  61.     function getCookie(name) {  
  62.         var cookieValue = null;  
  63.         if (document.cookie && document.cookie != '') {  
  64.             var cookies = document.cookie.split(';');  
  65.             for (var i = 0; i < cookies.length; i++) {  
  66.                 var cookie = jQuery.trim(cookies[i]);  
  67.                 // Does this cookie string begin with the name we want?  
  68.                 if (cookie.substring(0, name.length + 1) == (name + '=')) {  
  69.                     cookieValue = decodeURIComponent(cookie.substring(name.length + 1));  
  70.                     break;  
  71.                 }  
  72.             }  
  73.         }  
  74.         return cookieValue;  
  75.     }  
  76.     function sameOrigin(url) {  
  77.         // url could be relative or scheme relative or absolute  
  78.         var host = document.location.host; // host + port  
  79.         var protocol = document.location.protocol;  
  80.         var sr_origin = '//' + host;  
  81.         var origin = protocol + sr_origin;  
  82.         // Allow absolute or scheme relative URLs to same origin  
  83.         return (url == origin || url.slice(0, origin.length + 1) == origin + '/') ||  
  84.             (url == sr_origin || url.slice(0, sr_origin.length + 1) == sr_origin + '/') ||  
  85.             // or any other URL that isn't scheme relative or absolute i.e relative.  
  86.             !(/^(\/\/|http:|https:).*/.test(url));  
  87.     }  
  88.     function safeMethod(method) {  
  89.         return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));  
  90.     }  
  91.   
  92.     if (!safeMethod(settings.type) && sameOrigin(settings.url)) {  
  93.         xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));  
  94.     }  
  95. });  
  96.   
  97.   
  98. script>  
  99. head>  
  100.   
  101.   
  102.   
  103. <body scroll="no">  
  104.     <div id="layout">  
  105.         <div id="header">  
  106.             <div class="headerNav">  
  107.                   
  108.   
  109.                 <ul class="themeList" id="themeList">  
  110.                     <li theme="default"><div class="selected">蓝色div>li>  
  111.                     <li theme="green"><div>绿色div>li>  
  112.                 ul>  
  113.             div>  
  114.               
  115.             

你可能感兴趣的:(Django,Python)