动态地将app_label和model_name传递给Python Django中的url

时间:2016-12-27 09:50:18

标签: python django crud dry

我很好奇,为什么没有更多的人通过动态传递app_label和model_name作为URL的参数来讨论代码整合。

在为“非员工”用户构建通用CRUD操作时,我一直在寻找最“干”的方法。我开始尝试为“非员工”用户扩展Django Admin。后来我遇到了Django-Generic-Scaffold,它非常棒,但是支架模型可以预先建模而不是动态点播。

在深入研究Django Admin源代码后,我发现了这种技术,并且运行良好,但我想知道为什么这个技术不再讨论了?

urls.py

url(r'^(?P<app_label>[\w\-]+)/(?P<model_name>[\w\-]+)/$', DynamicListView.as_view(), name='list'),

views.py

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人来说,这是一种常用技术,还是存在以这种方式解决问题的问题?

0 个答案:

没有答案