Django:将数据传递给url调度程序查看,而不包括url中的数据?

时间:2011-01-16 23:15:02

标签: django url

我已经根据存储在数据库对象中的名称动态创建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都必须是唯一的。这是唯一的其他选择吗?

2 个答案:

答案 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)

您可以更改视图以期望此参数。