Django 2.0 动态生成 urlpatterns

Django 2.0 dynamically generate urlpatterns

我编写了这段从数据库动态生成 url 模式的代码。这些url只有一级路径:domain.com/something.

someapp/models.py

class SomeModel(models.Model):
    pattern = models.CharField(max_length=50)
    name = models.CharField(max_length=50)
    text = models.CharField(max_length=50)

someapp/apps.py

class SomeAppConfig(AppConfig):
    name = 'someapp'

    def ready(self):
        from .models import SomeModel
        from .urls import urlpatterns
        from . import views

        urls_in_db = SomeModel.objects.all()
        for url_in_db in urls_in_db:
            urlpatterns.append(path(url_in_db.pattern,
                                    views.SpecialView.as_view(),
                                    name=url_in_db.name)

someapp/views.py

class SpecialView(generic.TemplateView):
    template_name = 'template/view_template.html'
    model = SomeModel

    def get_context_data(self, **kwargs):
        context = super(SpecialView, self).get_context_data(**kwargs)
        context['content'] = SomeModel.objects.get(pattern=self.request.path)
    return context

这个解决方案是反模式吗?而且,如果是这样,为什么? 谢谢

是的,您的解决方案是一种反模式。 Django 支持 URL 模式中的参数,这些模式会被捕获并在相应的视图中变得可用。使用这些 URL 参数,您可以为数据库中特定类型的每条记录编写和维护一个 URL 模式。

查看 this example 个 URL 个参数。

最后,还要注意您的解决方案可能性能很差,因为您可能会根据数据库的大小创建数百万个 URL 模式。