已经折腾完第一个app了,现在接着参考:
Writing your first Django app, part 2
去折腾第二个app:
1.打开
E:\Dev_Root\WebServer\Django\fisrtApp\firstApp\firstApp\settings.py
添加admin:
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中运行:
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为:
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去运行服务器:
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
内容为:
from polls.models import Poll from django.contrib import admin admin.site.register(Poll)
关闭旧的server,重开cmd,重新运行server:
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
相关部分改为:
#admin.site.register(Poll) class PollAdmin(admin.ModelAdmin): fields = ['pub_date', 'question'] 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)
效果为:
5.再给admin.py添加代码:
from polls.models import Choice admin.site.register(Choice)
然后效果为:
去添加choice:
然后把代码改为:
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)
所以报错了:
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 ▶ Local vars 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]) ▶ Local vars 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
所以,重新改为:
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)
结果就正常了:
然后改为:
#class ChoiceInline(admin.StackedInline): class ChoiceInline(admin.TabularInline): model = Choice extra = 3
就变成了:
6.再去添加出来list_display:
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
改为:
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
改为:
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:
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:
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为:
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安装路径,也去试了试:
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就结束了。