1

テンプレートでモデルのフィルタリングを許可しないというジャンゴの設計選択に問題があります。実際、私はその意味を理解しており、それを壊したくはありませんが、現在、私の状況を回避するための最善または通常の方法が何であるかがわかりません.

別のモデルへTaskの外部キーを持つモデルを持っています。現在、すべてのタスクを繰り返し処理しています。ユーザーがこのタスクのソリューションを既に持っている場合は、チェックマークとソリューションへのリンクの両方を表示したいと考えています。ややこのように:user_solutionsSolution

{% for task in tasks %}
    {{ task.title }}
    {% if task.user_solutions.filter(author=author).count() > 0 %}
        Tick!
        {{ task.user_solutions.get(author=author).get_absolute_url }}
    {% endif %}
{% endfor %}

はい、データベースに同じ情報を 2 回照会するのは残酷に見えますが、django テンプレートはこのように (正しく) 受け入れません。

ただし、他のアプローチも機能しないようです。

  • Task.get_current_user_solution()モデルではログインしているユーザーがわからないため、メソッドを追加できません
  • Task.get_user_solution(user)テンプレートを介して引数を渡すことができないため、メソッドを追加できません
  • テンプレートでは、結合された変数を使用して辞書にアクセスすることはできませんcurrent_users_solutions(Task.idそして、それにアクセスするためのインデックスはもちろんですtask.id)

では、他に何ができるでしょうか?リンクされた記事から、テンプレートからのクエリを許可する新しいテンプレート タグを追加できることしかわかりませんが、前述のように、実際には可能であれば djangos の設計原則に従いたいと考えています。

4

3 に答える 3

1

ビュー内でタスクに好きなものを追加できるので、views.py では次のようにできます。

# in views.py
for task in tasks:
    if task.user_solutions.filter(author=author).count() > 0:
        task.is_this_users = True
        task.url = task.user_solutions.get(author=author).get.absolute_url

そして、あなたのテンプレートで:

{% for task in tasks %}
    {{ task.title }}
    {% if task.is_this_users %}
        Tick!
        {{ task.url }}
    {% endif %}
{% endfor %}
于 2013-07-05T06:53:22.323 に答える