Django 2.0动态生成urlpatterns

时间:2017-12-26 20:25:29

标签: python django url anti-patterns

我编写了这段代码,可以从数据库中动态生成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

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

1 个答案:

答案 0 :(得分:2)

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

查看this example网址参数。

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