1

Django アプリで定義されたモデルのツリーがあります (たとえば、'a' は多くの 'b' を持ち、多くの 'c' を持つ最上位モデルです)。これらを適切にレンダリングするビュー/テンプレートもあります。これらのモデルのそれぞれについて、通常、現在ログインしているユーザーに基づいてデータベース クエリを実行する必要があります。

たとえば、スタック オーバーフローの各ユーザーが質問に星印を付ける方法に似ています。私のモデルが質問の場合、現在のユーザーがこの質問にスターを付けているかどうかをモデルに尋ね、テンプレートで適切にレンダリングします。

私が最初に考えたのは、テンプレートにパラメーターを渡そうとすることでした (これは機能しないことがわかっています)。

# template
{{ question.is_starred(request.user) }}    # Can't work.

2 番目に考えたのは、何らかのタイプのグローバル変数を用意することでした (これは原則として好きではありません)。

# model
class question (Models.model)
    def _is_starred(self):
        # Use a global variable to find out the current logged in user!

私の3番目の考えは、現在ログインしているユーザーをビューにモデルに伝えることでしたが、問題は、モデルオブジェクトのツリーがあり、ツリー内のすべてのモデルを読み込んで設定する必要があると思います。それらをすべて使用してしまうわけではありません。オブジェクトは遅延ロードされていると思います。

# view
def view_one_question(request, question_id):
    q = Question.objects.get(pk=question_id)
    q.SetCurrentlyLoggedInUser (request.user.id)
    # !!!! But what about the other network of objects that the question has?
    return render_to_response(...)

アドバイスをいただければ幸いです。私はDjangoを初めて使用し、このプロジェクトを可能な限り最高の設計で開始しようとしています.

4

1 に答える 1

3

最初の例は正しいアイデアですが、実装が間違っています。Django テンプレートのメソッドにパラメーターを渡すことはできません。これを回避する最も簡単な方法は、単純なフィルターです。

# yourapp/templatetags/somefile.py

from django import template

register = template.Library()

@register.filter
def is_starred_for_user(question, user):
    return question.is_starred(user)

次に、テンプレートで次のようにします。

{% load somefile %}

{{ question|is_starred_for_user:request.user }}
于 2012-07-05T16:55:39.830 に答える