标签:
上一节我们介绍了django视图函数里面几个常用的函数,这节我们来看一下django为我们提供的一些通用视图吧
在最后面有我自己的示例代码,html部分太多了就不贴了
正如名字所言,简单视图函数封装在django.views.generic.simple模块里面,主要有direct_to_template和redirect_to两个简单视图函数,主要使用范围是:没有任何的视图逻辑,仅仅需要重定向一个url
描述:使用从url中获取的参数封装而成的在模板中名为{{ params }}的一个字典去渲染一个给定的模板
必选参数:
可选参数:
from django.views.generic.simple import direct_to_template urlpatterns = patterns(‘‘, (r‘^foo/$‘, direct_to_template, {‘template‘: ‘foo_index.html‘}), (r‘^foo/(?P<id>\d+)/$‘, direct_to_template, {‘template‘: ‘foo_detail.html‘}), )
第二个url里面传递的参数为{{ params.id }},对于/foo/15/这个请求来说,{{ params.id }}的值是15
描述:重定向到一个url
必选参数
可选参数
301(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。302(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置,
from django.views.generic.simple import redirect_to urlpatterns = patterns(‘‘, (‘^bar/$‘, redirect_to, {‘url‘: ‘%%7Ejacob.‘, ‘permanent‘: False}), )
需要注意的是,如果你想在url中使用%,必须使用%%来避免与python的字符串格式标记发送冲突
名字所言,用于显示基于日期型数据的明细页,包含在django.views.generic.date_based模块里面
描述
一个顶级的索引页按照时间显示最新的对象,除非设置allow_future为真,否则不会显示超前当前日期的对象
archive是存档的意思
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_archive.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量:
date_list: queryset.dates(date_field, ‘year‘)[::-1].包含所有的年份
latest: num_latest个按date_field降序排序的对象列表,默认变量名为latest,如果指定template_object_name,则变量名变为指定值
描述
返回一个显示给定一个年份中所有可用月份的年度存档页面,除非设置allow_future为真,否则不会显示超前当前日期的对象
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_archive_year.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
date_list: 类似上,包含所有的月份
year: 给定的年份(四位数字的字符串)
object_list: 如果make_object_list为真,列表中的所有对象将被封装成一个模板变量object_list,否则 object_list为空,默认为假,需要注意的是,如果设置了template_object_name,那么object_list中的object将被替换成template_object_list的值,例如template_object_list=‘foo‘,那么object_list变为foo_list
描述
返回一个显示给定月份的所有对象,除非设置allow_future为真,否则不会显示超前当前日期的对象
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_archive_month.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
描述
返回一个显示给定星期的所有对象,除非设置allow_future为真,否则不会显示超前当前日期的对象
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_archive_week.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
描述
返回一个显示给定日期的所有对象,除非设置allow_future为真,否则超前当前日期的请求都会引发404的错误(不管那天是否存在对象)
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_archive_day.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
day: 一个 datetime.date 对象代表给定的日期
next_day: 一个datetime.date 代表下一天,如果下一天在今天之后,则被设为None
previous_day: 一个 datetime.date 对象代表前一天,这永远不会设为None
描述
返回今天的所有对象的存档页面,除了没有年月日的指定外,基本和archive_day一样
描述
返回一个显示特定对象的页面,除非设置allow_future为真,否则若该对象超前当前日期会引发404的错误
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_detail.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
这个通用视图和基于日期的很像,位于django.views.generic.list_detail模块,不过基于日期的通用视图只有简单的两个页面:对象的列表和特定对象的详细页面
描述
返回一个显示一个列表的对象的页面
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_archive_list.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
如果is_paginated为真的话,下面两个变量在模板中将可用
当使用了paginated_by是,django会将结果分页,所以我们在一个在url中使用page number
urlconf:(r‘^objects/page(?P<page>[0-9]+)/$‘, ‘object_list‘, dict(info_dict))
url:/objects/?page=3
需要注意的是,page是从1开始,而不是从零开始的,如果page不合法,将促发404错误
亦可以使用last,如
/objects/?page=last
描述
返回一个显示特定对象的页面
必选参数
可选参数
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_detail.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
django.views.generic.create_update模块封装了生成/更新/删除对象的一些函数
描述
描述返回一个显示生成对象的表单页面,提交表单后显示提示错误(如果有的话)然后保存对象
必选参数
可选参数
post_save_redirect: 保存对象后跳转的url,默认是该对象的object.get_absolute_url()方法
login_required: 一个布尔值决定是否需要登录才能看到这个页面并保存修改,默认是假;如果为真,若不登陆,将转到登录页面(当然了,这个适合django的认证系统绑定的)
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_form.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
描述
描述返回一个显示编辑对象的表单页面,提交表单后显示提示错误(如果有的话)然后保存对象
必选参数
可选参数
post_save_redirect: 保存对象后跳转的url,默认是该对象的object.get_absolute_url()方法
login_required: 一个布尔值决定是否需要登录才能看到这个页面并保存修改,默认是假;如果为真,若不登陆,将转到登录页面(当然了,这个适合django的认证系统绑定的)
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_form.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
描述
一个视图,展示一个信息页面然后删除这个对象;仅当request method是post的时候,对象才会被删除;若是通过get请求该视图函数,将展示一个post到相同url的表单页面(信息页面)
必选参数
可选参数
post_save_redirect: 保存对象后跳转的url,默认是该对象的object.get_absolute_url()方法
login_required: 一个布尔值决定是否需要登录才能看到这个页面并保存修改,默认是假;如果为真,若不登陆,将转到登录页面(当然了,这个适合django的认证系统绑定的)
Template name:
如果没有给定template_name, 将会使用 默认模板<app_label>/<model_name>_confirm_delete.html
Template context:
除了可选参数的extra_context外, 模板上下文还包含以下变量
下面我们来看一些例子吧
models.py
from django.db import models from django.contrib import admin
from sysu.ThumbnailImageField import ThumbnailImageField # Create your models here. class Item(models.Model): """docstring for Item""" name = models.CharField(max_length=250) description = models.TextField() class Meta: ordering =[‘name‘] def __unicode__(self): return self.name @models.permalink def get_absolute_url(self): return (‘item_detail‘,None,{‘object_id‘:self.id}) class Photo(models.Model): """docstring for Photo""" item = models.ForeignKey(Item) title = models.CharField(max_length=100) image = ThumbnailImageField(upload_to=‘photos‘) caption = models.CharField(max_length=250) class Meta: ordering = [‘title‘] def __unicode__(self): return self.title @models.permalink def get_absolute_url(self): return (‘photo_detail‘,None,{‘object_id‘:self.id}) class PhotoInline(admin.StackedInline): """docstring for PhotoInline""" model = Photo class ItemAdmin(admin.ModelAdmin): """docstring for ItemAdmin""" inlines = [PhotoInline] admin.site.register(Item,ItemAdmin) admin.site.register(Photo) import datetime from django.db import models from django.db.models import permalink from django.contrib.auth.models import User from django.contrib import admin from markdown import markdown VIEWABLES_STATUS = [3,4] class ViewableManager(models.Manager): """docstring for ViewableManager""" def get_query_set(self): default_queryset = super(ViewableManager, self).get_query_set() return default_queryset.filter(status__in=VIEWABLES_STATUS) class Category(models.Model): """docstring for Category""" label = models.CharField(blank=True,max_length=50) slug = models.SlugField() class Meta: verbose_name_plural = "categories" def __unicode__(self): return self.label class CategoryAdmin(admin.ModelAdmin): """docstring for CategoryAdmin""" prepopulated_fields = {‘slug‘:(‘label‘,) } admin.site.register(Category,CategoryAdmin) class Stroy(models.Model): """docstring for Stroy""" STATUS_CHOICES = ( (1,"Needs Edit"), (2,"Needs Approval"), (3,"Published"), (4,"Archived"), ) title = models.CharField(max_length=100) slug = models.SlugField() category = models.ForeignKey(Category) markdown_content = models.TextField() html_content = models.TextField(editable=False) owner = models.ForeignKey(User) status = models.IntegerField(choices=STATUS_CHOICES,default=1) created = models.DateTimeField(default=datetime.datetime.now()) modified = models.DateTimeField(default=datetime.datetime.now()) class Meta: ordering = [‘modified‘] verbose_name_plural = "stories" def save(self): self.html_content = markdown(self.html_content) self.modified = datetime.datetime.now() super(Stroy, self).save() admin_objects = models.Manager() objects = ViewableManager() @permalink def get_absolute_url(self): return ("cms-story",None,{‘slug‘:self.slug}) class StroyAdmin(admin.ModelAdmin): """docstring for StroyAdmin""" list_display = (‘title‘,‘owner‘,‘status‘,‘created‘,‘modified‘) search_fields = (‘title‘,‘content‘) list_filter = (‘status‘,‘owner‘,‘created‘,‘modified‘) prepopulated_fields = {‘slug‘:(‘title‘,) } fieldsets = [ ("Title",{"fields":("title","slug","category")}), ("Content",{"fields":("markdown_content","owner")}), ("Status",{"classes":("monospace",),"fields":("status","created","modified")}) ] admin.site.register(Stroy,StroyAdmin)
ThumbnailImageField.py
# ThumbnailImageField.py from django.db.models.fields.files import ImageField,ImageFieldFile from PIL import Image import os def _add_thumb(s): parts = s.split(".") parts.insert(-1,"thumb") if parts[-1].lower() not in [‘jpeg‘,‘jpg‘]: parts[-1]=‘jpg‘ return ".".join(parts) class ThumbnailImageFieldFile(ImageFieldFile): def _get_thumb_path(self): return _add_thumb(self.path) thumb_path = property(_get_thumb_path) def _get_thumb_url(self): return _add_thumb(self.url) thumb_url = property(_get_thumb_url) def save(self,name,content,save=True): super(ThumbnailImageFieldFile, self).save(name,content,save) img = Image.open(self.path) img.thumbnail( (self.field.thumb_width,self.field.thumb_height), Image.ANTIALIAS ) img.save(self.thumb_path,‘JPEG‘) def delete(self,save=True): if os.path.exists(self.thumb_path): os.remove(self.thumb_path) super(ThumbnailImageFieldFile, self).delete(save) class ThumbnailImageField(ImageField): """docstring for ThumbnailImageField""" attr_class = ThumbnailImageFieldFile def __init__(self,thumb_width=128,thumb_height=128,*args,**kwargs): self.thumb_width = thumb_width self.thumb_height = thumb_height super(ThumbnailImageField, self).__init__(*args,**kwargs)
urls.py
from django.conf.urls import patterns, include, url from sysu.models import Item,Photo,Stroy # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() info_dict = {‘queryset‘:Stroy.objects.all()} urlpatterns =patterns(‘django.views.generic‘, url(r‘^cms/search/$‘,search,name="cms-search"), url(r‘^cms/(?P<slug>[-\w]+)/$‘, ‘list_detail.object_detail‘, kwargs={ ‘queryset‘:Stroy.objects.all(), ‘template_name‘:‘story_detail.html‘, ‘template_object_name‘:‘story‘ }, name="cms-story" ), url(r‘^cms/$‘, ‘list_detail.object_list‘, kwargs={ ‘queryset‘:Stroy.objects.all(), ‘template_name‘:‘story_list.html‘, ‘template_object_name‘:‘story‘ }, name="cms-home" ), url(r‘^cms/category/(?P<slug>[-\w]+)/$‘, category,name="cms-category"), # url(r‘^gallery/$‘, ‘simple.direct_to_template‘, # kwargs={ # ‘template‘:‘in.html‘, # ‘extra_context‘:{‘item_list‘:lambda:Item.objects.all()} # }, # name=‘index‘ # ), # url(r‘^gallery/items/$‘, ‘list_detail.object_list‘, # kwargs={ # ‘queryset‘:Item.objects.all(), # ‘template_name‘:‘item_list.html‘, # ‘allow_empty‘:True }, # name=‘item_list‘ # ), # url(r‘^items/(?P<object_id>\d+)/$‘, ‘list_detail.object_detail‘, # kwargs={ # ‘queryset‘:Item.objects.all(), # ‘template_name‘:‘items_detail.html‘ # }, # name=‘item_detail‘ # ), # url(r‘^gallery/photos/(?P<object_id>\d+)$‘, ‘list_detail.object_detail‘, # kwargs={ # ‘queryset‘:Photo.objects.all(), # ‘template_name‘:‘photos_detail.html‘ # }, # name=‘photo_detail‘ # ), # url(r‘pages/‘, include(‘django.contrib.flatpages.urls‘)), )
都是以前写过的代码,仅供大家参考,有什么大家可以随时交流
标签:
原文地址:http://www.cnblogs.com/qwj-sysu/p/4188320.html