python类的继承重构_python – 重构基于Django类的视图,清理18个重复的类.

将所有类压缩到一个继承自

TemplateResponseMixin的类,如

DetailView所示(也查看

SingleObjectTemplateResponseMixin)并覆盖其get_template_names()方法以返回适合当前情况的模板.

def get_template_names(self):

"""

Return a list of template names to be used for the view.

"""

model_type = self.get_model_type()

model_name = self.get_model_name()

templates = [

'zinnia/%s/%s/entry_list.html' % (model_type, model_name),

'zinnia/%s/%s_entry_list.html' % (model_type, model_name),

'zinnia/%s/entry_list.html' % model_type,

'zinnia/entry_list.html']

if self.template_name is not None:

templates.insert(0, self.template_name)

return templates

Django将获取该名称列表并尝试每个项目以查看它是否存在于templates文件夹中.如果是,则使用该模板.

更新

在仔细查看您的代码之后,可能是这样的:

在你的主urls.py

# convert each url

url(r'^$', FrontpageView.as_view()),

url(r'^history/$', HistoryView.as_view()),

url(r'^calendar/$', CalendarView.as_view()),

url(r'^news/$', NewsView.as_view()),

url(r'^visitors/$', VisitorsView.as_view()),

...

# to just

url(r'^(?P[\w\d/-]+)/$', SuperSpecialAwesomeView.as_view()),

# but, put this at the end of urls list after any routes that don't use this view

在设置类属性模型之后,DetailView将检查slug是否在url的kwargs中,如果是,它将使用slug进行模型查找,就像你正在做的那样:Article.ojects.get(slug) = self.kwargs [ ‘蛞蝓’])

models.py

您可以在文章模型中添加类型字段.该类型将指定它是什么类型的文章.例如,您的ChildrenView,YouthView和AdultView都可以拥有一种音乐类型(因为模板都是音乐,我假设它们是相关的).

ARTICLE_TYPE_CHOICES = (

(0, 'music'),

(1, 'weddings'),

(2, 'outreach'),

...

)

class Article(models.Model):

...

type = models.IntegerField(choices=ARTICLE_TYPE_CHOICES)

...

然后,在views.py中

class SuperSpecialAwesomeView(DetailView):

template_name = None

model = Article

def get_template_names(self):

slug = self.kwargs.get('slug', '')

templates = [

# create a template based on just the slug

'{0}.html'.format(slug),

# create a template based on the model's type

'{0}.html'.format(self.object.get_type_display()),

]

# Allow for template_name overrides in subclasses

if self.template_name is not None:

templates.insert(0, self.template_name)

return templates

鉴于一个带有一种音乐类型和一些事工/儿童的文章实例,Django将寻找一个名为ministry / children.html的模板和一个名为music.html的模板.

如果你需要为其他视图做一些特殊的事情(比如你可能需要SermonsView),那么子类SuperSpecialAwesomeView

class SermonsView(SuperSpecialAwesomeView):

paginate_by = 2

queryset = Article.objects.order_by('-publish_date')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值