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 模式。
我编写了这段从数据库动态生成 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 模式。