假设我有一些继承自基类 Animal 的模型。我可以使用通用视图并将 Cat/12 路由到详细视图,并将 Dod/10 路由到具有不同上下文的相同详细视图。但我想从 url 中获取模型名称,这样我就不必定义路由。
我有这样的事情:
url(r'^cat/(?P<slug>[-\w]+)/$',
DetailView.as_view(
queryset=Cat.objects.filter(),
model=Cat,
context_object_name='animal',
template_name='animal/detail.html'),
name='detail'),
url(r'^dog/(?P<slug>[-\w]+)/$',
DetailView.as_view(
queryset=Dog.objects.filter(),
model=Dog,
context_object_name='animal',
template_name='animal/detail.html'),
name='detail'),
...
显然,这是太多重复的代码。我宁愿做这样的事情:
url(r'^?P<my_animal>\w+/(?P<slug>[-\w]+)/$',
DetailView.as_view(
queryset=my_animal.objects.filter(),
model=my_animal,
context_object_name='animal',
template_name='animal/detail.html'),
name='detail'),
...
我可以这样做吗?
编辑
感谢达尔文的帮助,这就是我最终得到的结果。它避免了 if/else 来获取模型名称:
class AnimalDetailView(DetailView):
context_object_name='animal'
template_name='animals/detail.html'
def dispatch(self, request, *args, **kwargs):
my_animal = kwargs.get('my_animal', None)
self.model = get_model('animals',my_animal.capitalize())
try:
ret = super(AnimalDetailView, self).dispatch(request, *args, **kwargs)
except AttributeError:
raise Http404
return ret
def get_queryset(self):
return self.model.objects.filter()
下次我有关于继承的问题,我会咨询达尔文!哈哈