1

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.

4

1 に答える 1

1

考えられる解決策は、関連するモデルでカスタム model.Manager を使用することです。use_for_related_fields = Trueを設定して、Django が単純なマネージャーの代わりにそれを使用するように強制します。マネージャーを変更して、必要に応じてデータをフィルタリングします。

これも見てください:

Django:関連オブジェクトへのアクセスにマネージャーを使用する (use_for_related_fields docs)

stackoverflow: use_for_related_fields howto、ここで非常に良い説明。

于 2013-01-11T09:49:43.920 に答える