有没有一种方法可以禁止模板通过模型实例访问相关管理器

时间:2012-12-17 15:36:21

标签: django django-models django-templates

我需要一种优雅的方法来禁用或授权Django模板中的相关字段遍历。

想象一下models.py的设置:

class Person(models.Model):
    pass

class Secret(models.Model):
    owner = models.ForeignKey(Person, related_name="secrets")

现在假设这个简单的视图给出了系统中所有Person实例的模板QuerySet,这样模板就可以将它们放在一个列表中。

def show_people(request):
    render_to_response("people.html", {people=Person.objects.all()})

现在我的问题是我不会在这个虚构的系统中自己提供模板,而且我不完全信任制作模板的人。 show_people视图通过related_name="secrets"为people.html模板提供了Person实例的秘密。这个例子非常愚蠢,但实际上我有模型结构,模板提供者可以通过相关管理者访问所有类型的易受攻击的数据。

显而易见的解决方案不是将模型提供给模板,而是将它们转换为更安全的数据对象。但在我的情况下,这将是痛苦的,因为系统已经非常庞大并且已经启动并运行。

我认为一个很酷的解决方案是以某种方式阻止模板中的相关字段遍历。另一种解决方案是拥有这样的自定义相关管理器,它们可以访问请求对象并根据request.user过滤初始查询集。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是使用自定义model.Manager与您的相关模型。 设置 use_for_related_fields = True 以强制Django使用它而不是普通管理器。修改管理器以根据需要过滤数据。

也看看这个:

Django:using managers for related object access (use_for_related_fields docs)

stackoverflow:use_for_related_fields howto,这里有很好的解释。