我已经根据存储在数据库对象中的名称动态创建Django中的URL。所有这些页面都应由同一视图处理,但我希望数据库对象在调用时作为参数传递给视图。那可能吗?
以下是我目前的代码:
places = models.Place.objects.all()
for place in places:
name = place.name.lower()
urlpatterns += patterns('',
url(r'^'+name +'/$', 'misc.views.home', name='places.'+name)
)
是否可以将额外信息传递给视图,而无需向URL添加更多参数?由于URL是根目录,我仍然需要404页面显示其他值,我不能只使用字符串参数。解决方案是放弃尝试将URL添加到root,还是有其他解决方案?
我想我可以对名称本身进行查找,因为无论如何所有URL都必须是唯一的。这是唯一的其他选择吗?
答案 0 :(得分:20)
这通常是一个坏主意,因为它会查询数据库中的每个请求,而不仅仅是与该模型相关的请求。更好的想法是提出一般的网址组合,并对所有这些组成使用相同的视图。然后,您可以检索视图中的相关位置,该位置仅在到达特定视图时才会到达数据库。
例如:
urlpatterns += patterns('',
url(r'^places/(?P<name>\w+)/$', 'misc.views.home', name='places.view_place')
)
# views.py
def home(request, name):
place = models.Place.objects.get(name__iexact=name)
# Do more stuff here
我意识到这不是你真正要求的,但应该给你带来更少的麻烦。
答案 1 :(得分:20)
我认为您可以使用additional attributes将字典传递给视图,如下所示:
url(r'^'+name +'/$', 'misc.views.home', {'place' : place}, name='places.'+name)
您可以更改视图以期望此参数。