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 ビューは、 .html を通じて People インスタンスのシークレットを people.html テンプレートに提供しますrelated_name="secrets"
。この例は非常にばかげていますが、実際には、テンプレート プロバイダーが関連するマネージャーを介してあらゆる種類の脆弱なデータにアクセスできるモデル構造があります。
明らかな解決策は、モデルをテンプレートに与えるのではなく、より安全なデータ オブジェクトに変換することです。しかし、システムはすでにかなり大きく、稼働しているため、私の場合はそれは苦痛です。
これに対するクールな解決策は、テンプレートで関連するフィールドのトラバーサルを何とか防止することだと思います。別の解決策は、リクエスト オブジェクトにアクセスできるカスタム関連マネージャを用意し、request.user
.