HiJasper/django_site
Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
I love python I love web So i think choose django maybe a good idea You can find the example in : djangobook.py3k.cn/2.0/chapter02/ 28/11/2014 This Tag(1.0): use django-admin.py startproject to create a Django project use python manage.py runserver to start the local server After those two steps, you can check the web by http://127.0.0.1:8000/ Tag(1.1) Create hello web page Tag(1.2) Create time web page ('^time/$', current_datetime), Tag(1.3) Create time/plus/(\d{1,2})/ page Notes: 1.The page will not be found if you use \d{1, 2},because the space between 1 and 2 2.Use () to pass the parameters Tag(1.4) Use template module Notes: 1.Need change the value of TEMPLATE_DIRS in setting.py 2.Use function get_template to get the template from the path of TEMPLATE_DIRS Tag(1.5) render_to_response was used instead of get_template and HttpResponse Notes: You can use locals() instead of {'current_date':now},but the value of locals() also include the key-value about request Tag(1.6) 使用模版继承优化current_datetime.html和hours_ahead.html Tag(2.0) 模型: 新建project: library 新建app: books 1.数据库的配置: DATABASES = { 'default': { 'ENGINE': 'sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. 'NAME': '/home/jasper/Desktop/django/django_site/library/mydata.db', 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } } 2.use python manage.py startrapp books建立app 3.在models.py中建立模型 4.更改setting.py里面关于INSTALLED_APPS和MIDDLEWARE_CLASSES的部分 MIDDLEWARE_CLASSES = ( #'django.middleware.common.CommonMiddleware', #'django.contrib.sessions.middleware.SessionMiddleware', #'django.middleware.csrf.CsrfViewMiddleware', #'django.contrib.auth.middleware.AuthenticationMiddleware', #'django.contrib.messages.middleware.MessageMiddleware', ) INSTALLED_APPS = ( #'django.contrib.auth', #'django.contrib.contenttypes', #'django.contrib.sessions', #'django.contrib.sites', #'django.contrib.messages', #'django.contrib.staticfiles', "library.books", ) 5.python manage.py validate 验证模型有效性 6.python manage.py sqlall books生成CREATE TABLE语句 7.python manage.py syncdb 提交SQL语句到数据库 8.可以通过shell交互导入数据 >>> from books.models import Publisher >>> p1 = Publisher(name='Apress', address='2855 Telegraph Avenue', ... city='Berkeley', state_province='CA', country='U.S.A.', ... website='http://www.apress.com/') >>> p1.save() >>> p2 = Publisher.objects.create(name="O'Reilly", ... address='10 Fawcett St.', city='Cambridge', ... state_province='MA', country='U.S.A.', ... website='http://www.oreilly.com/') >>> publisher_list = Publisher.objects.all() #查询语句 >>> publisher_list 9.Publisher.objects.filter对数据筛选 Publisher.objects.get获取单个对象 Publisher.objects.order_by对数据排序 也可以用Publisher.objects.filter(country="U.S.A.").order_by("-name")进行连锁查询 数据的删除: >>> p = Publisher.objects.get(name="O'Reilly") >>> p.delete() Tag(3.0) The Django Admin Site: 1.django.contrib 包的使用: django.contrib包是Django代码的基本组成部分,也是一套庞大的功能集,原码在/usr/lib/python2.7/dist-packages/django/contrib下 2.功能集之一的admin的使用: 1.首先需要将django.contrib.admin加入setting.py的INSTALLED_APPS(其实admin也是一个app,他也有视图模版等) 2.同时在INSTALL_APP中添加'django.contrib.auth','django.contrib.contenttypes'和'django.contrib.sessions' 在MIDDLEWARE_CLASSES包含'django.middleware.common.CommonMiddleware','django.contrib.sessions.middleware.SessionMiddleware' 和'django.contrib.auth.middleware.AuthenticationMiddleware' 3.通过python manage.py syncdb创建超级管理员账户 4.完善url映射: from django.contrib import admin admin.autodiscover() # And include this URLpattern... urlpatterns = patterns('', # ... (r'^admin/', include(admin.site.urls)), ) 5.在books应用下建立admin.py(当服务启动时,Django从url.py引导URLconf,然后执行admin.autodiscover()语句.这个函数遍历INSTALLED_APPS配置, 并且寻找相关的 admin.py文件. 如果在指定的app目录下找到admin.py,它就执行其中的代码,至于Auth部分的加载则是因为 django.contrib.auth自带admin.py),内容如下: from django.contrib import admin from mysite.books.models import Publisher, Author, Book admin.site.register(Publisher) admin.site.register(Author) admin.site.register(Book) 加载models中的数据到admin中 6.在models中,给类添加__unicode__方法,设定该类返回的格式,如: class Book(models.Model): title = models.CharField(max_length=100) authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher) publication_date = models.DateField() def __unicode__(self): return self.title 7.设置可选片段: email = models.EmailField(blank=True) 从原码中可以看到EmailFiled等的类都是继承class Field,父类中balnk默认是False 8.设置别名: email = models.EmailField(blank=True, verbose_name='e-mail') 3.自定义ModelAdmi类 如: class BookAdmin(admin.ModelAdmin): list_display = ('title', 'publisher', 'publication_date') list_filter = ('publication_date',) date_hierarchy = 'publication_date' ordering = ('-publication_date',) fields = ('title', 'authors', 'publisher', 'publication_date') filter_horizontal = ('authors',) raw_id_fields = ('publisher',) admin.site.register(Book, BookAdmin) 1.list_display优化显示格式 2.list_filter过滤器 3.date_hierarchy根据时间进行索引 4.ordering排序(-表示降序) 5.fields定义需要显示的部分,可以用它隐藏掉不想被别人更改的部分 6.filter_horizontal JavaScript过滤器,允许检索选项,并且可以来回移动 7.raw_id_fields 它是一个包含外键字段名称的元组,它包含的字段将被展现成文本框,而不再是下拉框,可以减少下拉框因为数据太多导致缓慢的问题 Tag(4.0) 表单的使用: 1.要知道视图函数的参数request的用法 2.forms类的使用: class ContactForm(forms.Form): subject = forms.CharField() email = forms.EmailField(required=False) message = forms.CharField() 及一些as_ul,as_p,is_valid等方法的使用 3.forms类中的各个Field的参数使用: required,widget,max_length等 4.自定义校验规则 Tag(5.0) 1.URLconf 技巧 见urls.py Tag(5.1) 1.命名组的使用: 用url(r'^name_groups/(?P<name>\w{1,20})/(?P<age>\d{1,2})/$', 'named_groups')表示关键字参数 其中named_groups(request, name, age),关键字要一致,这也和一般函数的关键字用法相同 如果有任何命名的组,Django会忽略非命名组而直接使用命名组 2.传递额外的参数到视图函数中: 如: urlpatterns = patterns('', (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}), (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}), ) 在views.py中的试图函数的参数要和字典中的key一致 3.捕捉值和额外参数之间的优先级: (r'^mydata/(?P<id>\d+)/$', views.my_view, {'id': 3}) ?P<id>永远会被3覆盖 4.缺省视图参数: urls.py: urlpatterns = patterns('', (r'^blog/$', views.page), (r'^blog/page(?P<num>\d+)/$', views.page), ) views.py: def page(request, num='1'): 当匹配到blog/的时候,num使用缺省参数,num被赋值为'1',当/blog/pagex/被匹配时,num被赋值为被匹配到的值 5.特殊情况下的视图: urlpatterns = patterns('', ('^auth/user/add/$', views.user_add_stage), ('^([^/]+)/([^/]+)/add/$', views.add_stage), ) 在这种情况下,象 /auth/user/add/ 的请求将会被 user_add_stage 视图处理. 尽管URL也匹配第二种模式,它会先匹配上面的模式.(这是短路逻辑) 6.从url中获得的参数值都是以字符串的类型传递给视图函数的