2009-12-17 76 views
2

读者文摘版本:如何从模型中获取数据(单行如果指定或全表),方法是取模型名称的URL参数,而不对URLconf进行硬编码以匹配每个模型?有关详细信息,请阅读:模型访问的Django DRY URL

我做的是有三个型号的应用程序,我想作一个简单的观点,即需要一个模型的名称,并吐出模式的默认经理的Model.manager.all(),,如果有一个slu,,与slu matching相匹配的单个对象。我不知道如何做到这一点,所以我遇到了必须为每个模型单独制作views/URLconf的问题。

下面介绍一下的URLconf正在寻找这样的:

(r'^model1/$', 'model1_index_view', 'model1_index'), 
(r'^model1/(?P<slug>[-\w]+)/$', 'model1_detail_view', 'model1_detail'), 
(r'^model2/$', 'model2_index_view', 'model2_index'), 

它那张有点长,但我觉得你得到的图片。我正在硬编码一个相对较大数量的URLconf来做一些我认为我可以用一个Model作为参数并可选择一个slug的View。我担心的是,如果某人指定了一个模型名称,说什么......用户?是否有一段代码从应用程序中获取模型列表,并确保它匹配其中一个,而不是来自contrib.auth或另一个应用程序的模型?

回答

8

使用get_model:

from django.db.models import get_model 

def my_view(request, model_name, item_slug): 
    try: 
     model = get_model('app_name', model_name) 
    except: 
     ## throw an error 
     pass 
    objects = model.objects.get(slug=item_slug) 

然后在网址:

(r'^(?P<model_name>[-\w]+/(?P<slug>[-\w]+)/$', 'model_detail_view', 'model_detail'), 
+0

太感谢了,真的很感谢! – Zack 2009-12-17 20:40:48

+1

您可能想用“try ... except model.DoesNotExist:raise Http404”来包装“model.objects.get”以避免500错误。你可能想要验证model_name是一个有限的列表之一(你可以在URLconf中使用“(model1 | model2 | model3)”来做到这一点),以避免你提到的某人命名模型的潜在问题, t打算有可访问性。 – 2009-12-17 20:43:00

+0

这是一个好主意,我不确定在这种情况下是否需要将regexp添加到URLconf中,因为应用程序内的所有内容都可以浏览。不过,我会记住这一点,但它肯定会在未来派上用场(我用正则表达式很糟糕);我希望避免的主要事情是这个应用程序以某种方式“泄漏”到其他应用程序的模型中,如身份验证。再次感谢您的评论! – Zack 2009-12-17 21:08:12