我编写了这段代码,可以从数据库中动态生成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
这个解决方案是反模式吗?如果是这样,为什么? 感谢
答案 0 :(得分:2)
是的,您的解决方案是一种反模式。 Django支持URL模式中的参数,这些参数被捕获并在相应的视图中可用。使用这些URL参数,您可以为数据库中某种类型的每条记录编写和维护单个URL模式。
查看this example网址参数。
最后,还要注意您的解决方案可能会有非常差的性能,因为您可能会根据数据库的大小创建数百万个URL模式。