【问题标题】:Django DRY URLs for Model access用于模型访问的 Django DRY URL
【发布时间】:2009-12-17 20:16:49
【问题描述】:

读者文摘版本:如何通过获取模型名称的 URL 参数而不对 URLconfs 进行硬编码以匹配每个模型,从模型中获取数据(如果指定,则为单行或完整表)?更多详情,请继续阅读:

我正在制作一个包含三个模型的应用程序,我想制作一个简单的视图,该视图采用模型的名称,并吐出模型的默认管理器 Model.manager.all(),,如果有 slug,则单个对象匹配那个蛞蝓。我不知道该怎么做,所以我遇到了必须为每个模型单独制作视图/URLconfs 的问题。

以下是 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'),

它会持续一段时间,但我想你明白了。我最终硬编码了相对大量的 URLconfs 来做一些我认为我可以用一个 View 来做的事情,这个 View 将 Model 名称作为参数和可选的 slug。我担心的是,如果有人指定模型名称说...用户会发生什么?是否有一段代码可以从应用程序中获取模型列表并确保它与其中一个匹配,而不是来自 contrib.auth 或其他应用程序的模型?

【问题讨论】:

    标签: django dry django-urls


    【解决方案1】:

    使用 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'),
    

    【讨论】:

    • 非常感谢,非常感谢!
    • 您可能希望用“try...except model.DoesNotExist: raise Http404”包装“model.objects.get”以避免 500 错误。并且您可能想要验证 model_name 是有限列表之一(您可以在 URLconf 中使用“(model1|model2|model3)”来执行此操作),以避免您提到有人命名您没有的模型的潜在问题'不打算访问。
    • 这是个好主意,我不确定在这种情况下是否需要将正则表达式添加到 URLconf,因为应用程序内的所有内容都可以浏览。不过,我会记住这一点,它肯定会在未来派上用场(我对正则表达式很糟糕);我想要避免的主要事情是这个应用程序以某种方式“泄漏”到其他应用程序的模型中,比如身份验证。再次感谢您的评论!
    • 还有一个问题。我在每个模型中都有某些“实时”行,我希望在有人访问模型时只检索这些行。我已经为有这个问题的两个模型编写了一个管理器,Model.live_objects;有没有办法检测模型中定义的第一个管理器(在具有另一个管理器的两个模型中,它被定义,然后对象被重新定义,我相信你如何让它“默认”,虽然不是 100% 确定.) 并使用它而不是 Model.objects?
    • 你可能不得不使用 ifs 来获得它。类似: if hasattr(model, "live_objects"): ## do something 对不起,如果格式化被破坏了。
    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 2013-10-15
    • 2010-11-10
    • 2014-09-09
    • 2015-08-11
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多