我很好奇,为什么没有更多的人通过动态传递app_label和model_name作为URL的参数来讨论代码整合。
在为“非员工”用户构建通用CRUD操作时,我一直在寻找最“干”的方法。我开始尝试为“非员工”用户扩展Django Admin。后来我遇到了Django-Generic-Scaffold,它非常棒,但是支架模型可以预先建模而不是动态点播。
在深入研究Django Admin源代码后,我发现了这种技术,并且运行良好,但我想知道为什么这个技术不再讨论了?
url(r'^(?P<app_label>[\w\-]+)/(?P<model_name>[\w\-]+)/$', DynamicListView.as_view(), name='list'),
class DynamicListView(LoginRequiredMixin, ListView):
template_name = 'dynamic_list.html'
@property
def model(self):
return apps.get_model(app_label=str(self.kwargs['app_label']), model_name=str(self.kwargs['model_name']))
@property
def app_label(self):
return str(self.kwargs['app_label'])
def get_queryset(self):
queryset = super(DynamicListView, self).get_queryset()
if self.app_label == 'auth':
return Http404
else:
return queryset.filter(**self.request.GET.dict())
def dispatch(self, request, *args, **kwargs):
if request.user.is_superuser:
return super(DynamicListView, self).dispatch(request, *args, **kwargs)
else:
# Set permissions here for non-staff users
例如,假设我们有一个名为“图书馆”的应用程序和两个模型Book and Author:
class Author(models.Model):
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.ForeignKey(Author)
def __str__(self):
return self.title
使用这种技术,我们可以使用一组URL来列出,创建,更新Book,Author或任何其他模型:
http://domain/library/book/ 要么 http://domain/library/author/
我开发的项目中包含50多个模型的应用程序。在过去,我为每个模型“硬编码”了视图,但它是如此重复。对于那里的Django人来说,这是一种常用技术,还是存在以这种方式解决问题的问题?