Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于模型访问的Django DRY URL_Django_Dry_Django Urls - Fatal编程技术网

用于模型访问的Django DRY URL

用于模型访问的Django DRY URL,django,dry,django-urls,Django,Dry,Django Urls,读者文摘版本:如何通过获取模型名称的URL参数而不硬编码URLConf以匹配每个模型,从而从模型中获取数据(如果指定,则为单行或完整表)?有关更多详细信息,请阅读: 我正在制作一个有三个模型的应用程序,我想制作一个简单的视图,以一个模型的名称命名,并吐出模型的默认管理器的model.manager.all(),,如果有一个slug,一个对象匹配该slug。我不知道如何做到这一点,因此我遇到了必须分别为每个模型创建视图/URLConf的问题 以下是URLConf的外观: (r'^model1/$'

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

我正在制作一个有三个模型的应用程序,我想制作一个简单的视图,以一个模型的名称命名,并吐出模型的默认管理器的
model.manager.all(),
,如果有一个slug,一个对象匹配该slug。我不知道如何做到这一点,因此我遇到了必须分别为每个模型创建视图/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'),
(r“^model1/$”、“model1索引视图”、“model1索引”),
(r“^model1/(?P[-\w]+)/$”、“model1详细信息视图”、“model1详细信息”),
(r“^model2/$”、“model2\u索引视图”、“model2\u索引”),
它会持续一段时间,但我想你明白了。我最终硬编码了相对大量的URLConf来做一些事情,我想我可以用一个视图来做,这个视图可以将模型名作为参数,也可以选择使用slug。我关心的是,如果有人指定一个模型名,比如说。。。用户?是否有一段代码可以从应用程序中获取模型列表,并确保它与其中一个模型匹配,而不是contrib.auth或其他应用程序中的模型?

使用get\u 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)
然后在URL中:

 (r'^(?P<model_name>[-\w]+/(?P<slug>[-\w]+)/$', 'model_detail_view', 'model_detail'),
(r'^(?P[-\w]+/(?P[-\w]+)/$),“模型详细视图”,“模型详细视图”,

非常感谢,非常感谢!您可能希望将“model.objects.get”包装为“try…except model.DoesNotExist:raise Http404”以避免500个错误。并且您可能希望验证model_name是有限列表中的一个(您可以使用URLconf中的“(model1 | model2 | model3)”来完成此操作),以避免您提到的潜在问题,即某人命名您不打算访问的模型。这是一个好主意,我不确定在这种情况下是否需要将regexp添加到URLconf,因为应用程序中的所有内容都可以浏览。不过,我会记住这一点,它在将来肯定会派上用场(我对regexps很糟糕);我想避免的主要事情是这个应用程序以某种方式“泄漏”到其他应用程序的模型中,比如auth。再次感谢你的评论!不过还有一个问题。我已经确定了“live”每个模型中都有行,我只希望在有人访问模型时检索这些行。我已经为存在此问题的两个模型编写了一个管理器model.live_objects;是否有方法检测模型中定义的第一个管理器(在有另一个管理器的两个模型中,它被定义,然后对象被重新定义,我相信你如何使它成为“默认”,但不是100%确定。)并使用它而不是模型。对象?你可能必须使用ifs来获得它。类似于:if hasattr(Model,“live_objects”):##如果格式化被冲洗,请做些对不起的事。