已经折腾完第一个app了,现在接着参考:
Writing your first Django app, part 2
去折腾第二个app:
1.打开
E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\firstApp\settings.py
添加admin:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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' , # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'polls' , ) |
去cmd中运行:
1 2 3 4 5 6 | E:\Dev_Root\WebServer\Django\fisrtApp\firstApp>manage.py syncdb Creating tables ... Creating table django_admin_log Installing custom SQL ... Installing indexes ... Installed 0 object(s) from 0 fixture(s) |
修改E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\firstApp\urls.py为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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'^$', 'firstApp.views.home', name='home'), # url(r'^firstApp/', include('firstApp.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)), ) |
2.另外开个cmd去运行服务器:
1 2 3 4 5 6 7 8 | E:\Dev_Root\WebServer\Django\fisrtApp\firstApp>manage.py runserver Validating models... 0 errors found Django version 1.4.1, using settings 'firstApp.settings' Development server is running at http: //127 .0.0.1:8000/ Quit the server with CTRL-BREAK. [14 /Oct/2012 22:09:42] "GET /admin/ HTTP/1.1" 200 1896 |
然后再去打开对应的admin页面,就可以看到登录界面了:
登录后:
3.新建:
E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\polls\admin.py
内容为:
1 2 3 4 | from polls.models import Poll from django.contrib import admin admin.site.register(Poll) |
关闭旧的server,重开cmd,重新运行server:
1 2 3 4 5 6 7 | E:\Dev_Root\WebServer\Django\fisrtApp\firstApp>manage.py runserver Validating models... 0 errors found Django version 1.4.1, using settings 'firstApp.settings' Development server is running at http: //127 .0.0.1:8000/ Quit the server with CTRL-BREAK. |
刷新http://127.0.0.1:8000/admin/即可看到新的polls的UI了:
点击Polls,进入change的ui:
点击后可以编辑:
修改后,点击history,可以看到历史记录:
4.把
E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\polls\admin.py
相关部分改为:
1 2 3 4 5 | #admin.site.register(Poll) class PollAdmin(admin.ModelAdmin): fields = [ 'pub_date' , 'question' ] admin.site.register(Poll, PollAdmin) |
然后刷新页面可以看到变化:
再变为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # #admin.site.register(Poll) # class PollAdmin(admin.ModelAdmin): # fields = ['pub_date', 'question'] # admin.site.register(Poll, PollAdmin) class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ]}), ] admin.site.register(Poll, PollAdmin) |
效果为:
再改为:
1 2 3 4 5 6 7 | class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] admin.site.register(Poll, PollAdmin) |
效果为:
5.再给admin.py添加代码:
1 2 3 | from polls.models import Choice admin.site.register(Choice) |
然后效果为:
去添加choice:
然后把代码改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | from polls.models import Poll from django.contrib import admin from polls.models import Choice #------------------------------------------------------------------------------- # admin.site.register(Choice) class ChoiceInline(admin.StackedInline): model = Choice extra = 3 class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] inlines = [ChoiceInline] admin.site.register(Poll, PollAdmin) #------------------------------------------------------------------------------- # #admin.site.register(Poll) # class PollAdmin(admin.ModelAdmin): # fields = ['pub_date', 'question'] # admin.site.register(Poll, PollAdmin) # class PollAdmin(admin.ModelAdmin): # fieldsets = [ # (None, {'fields': ['question']}), # ('Date information', {'fields': ['pub_date']}), # ] # admin.site.register(Poll, PollAdmin) class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] admin.site.register(Poll, PollAdmin) |
结果由于重复出现了两个
admin.site.register(Poll, PollAdmin)
所以报错了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | AlreadyRegistered at /admin/polls/ The model Poll is already registeredRequest Method: GET Request URL: http: //127 .0.0.1:8000 /admin/polls/ Django Version: 1.4.1 Exception Type: AlreadyRegistered Exception Value: The model Poll is already registered Exception Location: E:\dev_install_root\Python27\lib\site-packages\django\contrib\admin\sites.py in register, line 80 Python Executable: E:\dev_install_root\Python27\python.exe Python Version: 2.7.2 Python Path: [ 'E:\\Dev_Root\\WebServer\\Django\\fisrtApp\\firstApp' , 'E:\\dev_install_root\\Python27\\lib\\site-packages\\distribute-0.6.28-py2.7.egg' , 'C:\\Windows\\system32\\python27.zip' , 'E:\\dev_install_root\\Python27\\DLLs' , 'E:\\dev_install_root\\Python27\\lib' , 'E:\\dev_install_root\\Python27\\lib\\plat-win' , 'E:\\dev_install_root\\Python27\\lib\\lib-tk' , 'E:\\dev_install_root\\Python27' , 'E:\\dev_install_root\\Python27\\lib\\site-packages' , 'E:\\dev_install_root\\Python27\\lib\\site-packages\\setuptools-0.6c11-py2.7.egg-info' ] Server time : Sun, 14 Oct 2012 22:38:41 +0800 Traceback Switch to copy-and- paste view E:\dev_install_root\Python27\lib\site-packages\django\core\handlers\base.py in get_response if hasattr(request, "urlconf" ): # Reset url resolver with a custom urlconf. urlconf = request.urlconf urlresolvers.set_urlconf(urlconf) resolver = urlresolvers.RegexURLResolver(r'^/', urlconf) callback, callback_args, callback_kwargs = resolver.resolve( request.path_info) ... # Apply view middleware for middleware_method in self._view_middleware: response = middleware_method(request, callback, callback_args, callback_kwargs) if response: break
Variable Value settings <django.conf.LazySettings object at 0x0000000002591DD8> middleware_method <bound method MessageMiddleware.process_request of <django.contrib.messages.middleware.MessageMiddleware object at 0x000000000331F9B0>> self <django.core.handlers.wsgi.WSGIHandler object at 0x00000000032ABDA0> request "<WSGIRequest\npath:/admin/polls/,\nGET:<QueryDict: {}>,\nPOST:<QueryDict: {}>,\nCOOKIES:{'csrftoken': 'pZqqwmY5XFbdHPz1el5MU5CyGgmQAFjA',\n 'sessionid': '568f8b2f1ee7fb3b7d443834f9acd15e'},\nMETA:{'ALLUSERSPROFILE': 'C:\\\\ProgramData',\n 'AMDAPPSDKROOT': 'C:\\\\Program Files (x86)\\\\AMD APP\\\\',\n 'ANT_HOME': 'E:\\\\Dev_Root\\\\docbook\\\\tools\\\\ant\\\\apache-ant-1.8.4',\n 'APPDATA': 'C:\\\\Users\\\\Administrator\\\\AppData\\\\Roaming',\n 'COMMONPROGRAMFILES': 'C:\\\\Program Files\\\\Common Files',\n 'COMMONPROGRAMFILES(X86)': 'C:\\\\Program Files (x86)\\\\Common Files',\n 'COMMONPROGRAMW6432': 'C:\\\\Program Files\\\\Common Files',\n 'COMPUTERNAME': 'NYBDHB7EB3XEHP6',\n 'COMSPEC': 'C:\\\\Windows\\\\system32\\\\cmd.exe',\n 'CONTENT_LENGTH': '',\n 'CONTENT_TYPE': 'text/plain',\n 'DJANGO_SETTINGS_MODULE': 'firstApp.settings',\n 'FOP_HOME': 'E:/Dev_Root/docbook/tools/fop-1.0',\n 'FP_NO_HOST_CHECK': 'NO',\n 'GATEWAY_INTERFACE': 'CGI/1.1',\n 'HOMEDRIVE': 'C:',\n 'HOMEPATH': '\\\\Users\\\\Administrator',\n 'HTTP_ACCEPT': 'application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*',\n 'HTTP_ACCEPT_ENCODING': 'gzip, deflate',\n 'HTTP_ACCEPT_LANGUAGE': 'zh-CN',\n 'HTTP_CONNECTION': 'Keep-Alive',\n 'HTTP_COOKIE': 'csrftoken=pZqqwmY5XFbdHPz1el5MU5CyGgmQAFjA; sessionid=568f8b2f1ee7fb3b7d443834f9acd15e',\n 'HTTP_HOST': '127.0.0.1:8000',\n 'HTTP_REFERER': 'http://127.0.0.1:8000/admin/polls/choice/add/',\n 'HTTP_USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)',\n 'JAVA_HOME': 'C:\\\\Program Files (x86)\\\\Java\\\\jre7',\n 'LOCALAPPDATA': 'C:\\\\Users\\\\Administrator\\\\AppData\\\\Local',\n 'LOGONSERVER': '\\\\\\\\NYBDHB7EB3XEHP6',\n 'NUMBER_OF_PROCESSORS': '4',\n 'OS': 'Windows_NT',\n 'PATH': 'C:\\\\Program Files\\\\Common Files\\\\Microsoft Shared\\\\Windows Live;C:\\\\Program Files (x86)\\\\Common Files\\\\Microsoft Shared\\\\Windows Live;C:\\\\Program Files (x86)\\\\AMD APP\\\\bin\\\\x86_64;C:\\\\Program Files (x86)\\\\AMD APP\\\\bin\\\\x86;C:\\\\Windows\\\\system32;C:\\\\Windows;C:\\\\Windows\\\\System32\\\\Wbem;C:\\\\Windows\\\\System32\\\\WindowsPowerShell\\\\v1.0\\\\;C:\\\\Program Files (x86)\\\\ATI Technologies\\\\ATI.ACE\\\\Core-Static;C:\\\\Program Files (x86)\\\\Windows Live\\\\Shared;E:\\\\dev_install_root\\\\TortoiseSVN\\\\bin;c:\\\\Program Files (x86)\\\\Microsoft SQL Server\\\\100\\\\Tools\\\\Binn\\\\;c:\\\\Program Files\\\\Microsoft SQL Server\\\\100\\\\Tools\\\\Binn\\\\;c:\\\\Program Files\\\\Microsoft SQL Server\\\\100\\\\DTS\\\\Binn\\\\;E:\\\\Dev_Root\\\\docbook\\\\tools\\\\libxml\\\\bin;E:/Dev_Root/docbook/tools/fop-1.0;C:\\\\Program Files (x86)\\\\Java\\\\jre7\\\\bin;E:\\\\Dev_Root\\\\docbook\\\\tools\\\\ant\\\\apache-ant-1.8.4\\\\bin;E:\\\\dev_install_root\\\\HTML Help Workshop;D:\\\\Program Files\\\\7-Zip;E:\\\\dev_install_root\\\\Python27;E:\\\\dev_install_root\\\\Python27\\\\Scripts;',\n 'PATHEXT': '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC',\n 'PATH_INFO': u'/admin/polls/',\n 'PROCESSOR_ARCHITECTURE': 'AMD64',\n 'PROCESSOR_IDENTIFIER': 'Intel64 Family 6 Model 37 Stepping 5, GenuineIntel',\n 'PROCESSOR_LEVEL': '6',\n 'PROCESSOR_REVISION': '2505',\n 'PROGRAMDATA': 'C:\\\\ProgramData',\n 'PROGRAMFILES': 'C:\\\\Program Files',\n 'PROGRAMFILES(X86)': 'C:\\\\Program Files (x86)',\n 'PROGRAMW6432': 'C:\\\\Program Files',\n 'PROMPT': '$P$G',\n 'PSMODULEPATH': 'C:\\\\Windows\\\\system32\\\\WindowsPowerShell\\\\v1.0\\\\Modules\\\\',\n 'PUBLIC': 'C:\\\\Users\\\\Public',\n 'QUERY_STRING': '',\n 'REMOTE_ADDR': '127.0.0.1',\n 'REMOTE_HOST': '',\n 'REQUEST_METHOD': 'GET',\n 'RUN_MAIN': 'true',\n 'SCRIPT_NAME': u'',\n 'SERVER_NAME': 'NYBDHB7EB3XEHP6',\n 'SERVER_PORT': '8000',\n 'SERVER_PROTOCOL': 'HTTP/1.1',\n 'SERVER_SOFTWARE': 'WSGIServer/0.1 Python/2.7.2',\n 'SESSIONNAME': 'Console',\n 'SYSTEMDRIVE': 'C:',\n 'SYSTEMROOT': 'C:\\\\Windows',\n 'TEMP': 'C:\\\\Users\\\\ADMINI~1\\\\AppData\\\\Local\\\\Temp',\n 'TMP': 'C:\\\\Users\\\\ADMINI~1\\\\AppData\\\\Local\\\\Temp',\n 'USERDOMAIN': 'NYBDHB7EB3XEHP6',\n 'USERNAME': 'Administrator',\n 'USERPROFILE': 'C:\\\\Users\\\\Administrator',\n 'VBOX_INSTALL_PATH': 'E:\\\\dev_install_root\\\\Oracle\\\\VirtualBox\\\\',\n 'VS100COMNTOOLS': 'C:\\\\Program Files (x86)\\\\Microsoft Visual Studio 10.0\\\\Common7\\\\Tools\\\\',\n 'WINDIR': 'C:\\\\Windows',\n 'WINDOWS_TRACING_FLAGS': '3',\n 'WINDOWS_TRACING_LOGFILE': 'C:\\\\BVTBin\\\\Tests\\\\installpackage\\\\csilogfile.log',\n '_DFX_INSTALL_UNSIGNED_DRIVER': '1',\n 'wsgi.errors': <open file '<stderr>', mode 'w' at 0x0000000001E5E1E0>,\n 'wsgi.file_wrapper': <class wsgiref.util.FileWrapper at 0x0000000002CDFE28>,\n 'wsgi.input': <socket._fileobject object at 0x00000000032BD750>,\n 'wsgi.multiprocess': False,\n 'wsgi.multithread': True,\n 'wsgi.run_once': False,\n 'wsgi.url_scheme': 'http',\n 'wsgi.version': (1, 0)}>" exceptions <module 'django.core.exceptions' from 'E:\dev_install_root\Python27\lib\site-packages\django\core\exceptions.pyc' > resolver <RegexURLResolver firstApp.urls (None:None) ^/> urlresolvers <module 'django.core.urlresolvers' from 'E:\dev_install_root\Python27\lib\site-packages\django\core\urlresolvers.pyc' > response None urlconf 'firstApp.urls' E:\dev_install_root\Python27\lib\site-packages\django\core\urlresolvers.py in resolve return self._app_dict[language_code] def resolve(self, path): tried = [] match = self.regex.search(path) if match: new_path = path[match.end():] for pattern in self.url_patterns: ... try: sub_match = pattern.resolve(new_path) except Resolver404, e: sub_tried = e.args[0].get( 'tried' ) if sub_tried is not None: tried.extend([[pattern] + t for t in sub_tried])
Variable Value path u '/admin/polls/' self <RegexURLResolver firstApp.urls (None:None) ^/> new_path u 'admin/polls/' tried [] match <_sre.SRE_Match object at 0x000000000331E718> E:\dev_install_root\Python27\lib\site-packages\django\core\urlresolvers.py in url_patterns return self._urlconf_module except AttributeError: self._urlconf_module = import_module(self.urlconf_name) return self._urlconf_module @property def url_patterns(self): patterns = getattr(self.urlconf_module, "urlpatterns" , self.urlconf_module) ... try: iter(patterns) except TypeError: raise ImproperlyConfigured( "The included urlconf %s doesn't have any patterns in it" % self.urlconf_name) return patterns |
所以,重新改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | from polls.models import Poll from django.contrib import admin from polls.models import Choice #------------------------------------------------------------------------------- admin.site.register(Choice) #------------------------------------------------------------------------------- # #admin.site.register(Poll) # class PollAdmin(admin.ModelAdmin): # fields = ['pub_date', 'question'] # admin.site.register(Poll, PollAdmin) # class PollAdmin(admin.ModelAdmin): # fieldsets = [ # (None, {'fields': ['question']}), # ('Date information', {'fields': ['pub_date']}), # ] # admin.site.register(Poll, PollAdmin) # class PollAdmin(admin.ModelAdmin): # fieldsets = [ # (None, {'fields': ['question']}), # ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), # ] # admin.site.register(Poll, PollAdmin) class ChoiceInline(admin.StackedInline): model = Choice extra = 3 class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] inlines = [ChoiceInline] admin.site.register(Poll, PollAdmin) |
结果就正常了:
然后改为:
1 2 3 4 | #class ChoiceInline(admin.StackedInline): class ChoiceInline(admin.TabularInline): model = Choice extra = 3 |
就变成了:
6.再去添加出来list_display:
1 2 3 4 5 6 7 8 | class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] inlines = [ChoiceInline] list_display = ( 'question' , 'pub_date' ) list_display = ( 'question' , 'pub_date' , 'was_published_recently' ) |
然后效果为:
E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\polls\models.py
改为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import datetime; from django.utils import timezone; from django.db import models # Create your models here. class Poll(models.Model): question = models.CharField(max_length = 200 ) pub_date = models.DateTimeField( 'date published' ) def __unicode__( self ): return self .question; def was_published_recently( self ): return self .pub_date > = (timezone.now() - datetime.timedelta(days = 1 )); was_published_recently.admin_order_field = 'pub_date' was_published_recently.boolean = True was_published_recently.short_description = 'Published recently?' class Choice(models.Model): poll = models.ForeignKey(Poll) choice = models.CharField(max_length = 200 ) votes = models.IntegerField() def __unicode__( self ): return self .choice; |
然后E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\polls\admin.py
改为:
1 2 3 4 5 6 7 8 9 | class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] inlines = [ChoiceInline] list_display = ( 'question' , 'pub_date' ) list_display = ( 'question' , 'pub_date' , 'was_published_recently' ) list_filter = [ 'pub_date' ] |
效果为:
再添加search:
1 2 3 4 5 6 7 8 9 10 | class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] inlines = [ChoiceInline] list_display = ( 'question' , 'pub_date' ) list_display = ( 'question' , 'pub_date' , 'was_published_recently' ) list_filter = [ 'pub_date' ] search_fields = [ 'question' ] |
效果为:
添加上date:
1 2 3 4 5 6 7 8 9 10 11 | class PollAdmin(admin.ModelAdmin): fieldsets = [ ( None , { 'fields' : [ 'question' ]}), ( 'Date information' , { 'fields' : [ 'pub_date' ], 'classes' : [ 'collapse' ]}), ] inlines = [ChoiceInline] list_display = ( 'question' , 'pub_date' ) list_display = ( 'question' , 'pub_date' , 'was_published_recently' ) list_filter = [ 'pub_date' ] search_fields = [ 'question' ] date_hierarchy = 'pub_date' |
效果为:
7.把
E:\dev_install_root\Python27\Lib\site-packages\django\contrib\admin\templates\admin\base_site.html
拷贝到
E:\Dev_Root\WebServer\Django\crifan\mytemplates\admin
中。
然后修改E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\firstApp\settings.py为:
1 2 3 4 5 6 | 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. "E:/Dev_Root/WebServer/Django/crifan/mytemplates" ) |
关于查找django安装路径,也去试了试:
1 2 3 4 5 6 7 8 9 | E:\Dev_Root\WebServer\Django\fisrtApp\firstApp>python Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v .1500 64 bit (AMD64)] on win32 Type "help" , "copyright" , "credits" or "license" for more information. >>> import sys >>> sys.path = sys.path[1:]; >>> import django >>> print(django.__path__); [ 'E:\\dev_install_root\\Python27\\lib\\site-packages\\django' ] >>> |
另外,修改了logo:
至此,第二个app就结束了。