在Python Django中动态地将app_标签和model_名称传递给url

在Python Django中动态地将app_标签和model_名称传递给url,python,django,crud,dry,Python,Django,Crud,Dry,我很好奇,为什么没有更多的人通过动态地将app_label和model_name作为参数传递给URL来谈论代码整合呢 在为“非工作人员”用户构建通用CRUD操作时,我一直在寻找最“枯燥”的方法。我开始尝试为“非工作人员”用户扩展Django管理员。后来我遇到了Django Generic脚手架,这非常棒,但是脚手架是预先建模的,而不是按需动态建模的 在深入研究Django管理源代码后,我发现了这项技术,并使其运行良好,但我想知道为什么不进一步讨论这项技术 url.py 例如,假设我们有一个名为“

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

在为“非工作人员”用户构建通用CRUD操作时,我一直在寻找最“枯燥”的方法。我开始尝试为“非工作人员”用户扩展Django管理员。后来我遇到了Django Generic脚手架,这非常棒,但是脚手架是预先建模的,而不是按需动态建模的

在深入研究Django管理源代码后,我发现了这项技术,并使其运行良好,但我想知道为什么不进一步讨论这项技术

url.py 例如,假设我们有一个名为“Library”的应用程序和两个模型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来列出、创建、更新书籍、作者或任何其他模型:


我开发的应用程序在一个项目中有50多个模型。在过去,我为每个模型“硬编码”视图,但它是如此重复。对于Django人来说,这是一种常用的技术还是用这种方法解决问题有问题?

你必须小心使用这种模式。您当前的设置允许用户查看/更改所有模型,甚至是“内部”模型,如
权限
站点
。管理员通过生成
(?Papp_1 | app_2 | app_3)
格式的url模式,明确列出已注册的应用程序/模型。根据我的经验,不同的模型通常有稍微不同的要求。在你的情况下可能会有所不同,但我怀疑大多数网站都是这样。这些微小的差异极大地限制了这种模式的实用性。正如knbk所说:简单的通用CRUD很少适合实际领域的复杂性(这也是“admin”应用程序FWIW的局限之一)。我做django项目已经10多年了,从来没有一个通用积垢有用的案例。但是如果它解决了你的问题,那就好了…谢谢你的快速回复。我使用dispatch来管理应用程序标签白名单,我没有将其包含在上面的代码中。另外,我的非工作人员用户所做的大约90%是基本的crud操作。我希望这有帮助。
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
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