0

奇妙なタイトルで申し訳ありませんが、状況を一言で説明できませんでした。明確にしましょう:

オブジェクトをテンプレートに表示する Jobs モデルがあります。各求人に対して、ユーザーがその求人に既に応募しているかどうかも表示したいと考えています。

私はこれらのモデルを持っています

class Job(models.Model):
    is_valid = models.BooleanField()
    description = models.CharField()
    def has_user_applied(self, user):
        return jobapplication_set.filter(applicant=user).exists()

class JobApplication(models.Model):
    applicant = models.ForeignKey(User)    
    job = models.ForeignKey(Job)
    cover_letter = models.CharField()

そして、すべてのジョブをフェッチするビュー:

 jobs = Job.objects.filter(is_valid=True)
 return HttpResponse( ... {'jobs': jobs} ... )

そして、それらをリストしたテンプレート:

 {% for j in jobs %}
 {{ j.description }} {% if j.has_applied %} (You've already applied) {% endif %}
 {% endfor %}

ただし、「has_applied」関数は引数として「user」を取り、テンプレートで引数を渡すことは許可されていません。

今、私は2つの問題があります:

一部の関数が、明示的に渡されてテンプレートでの使用を制限するのではなく、特定のユーザーが問題であると想定できるように、「コンテキスト」を作成できますか? それが不可能な場合、ビューのモデル オブジェクトでこの情報に注釈を付けるエレガントな方法は何ですか?

第 2 に、これができたとしても、ジョブ オブジェクトごとに、ユーザーが既に適用されているかどうかを判断するために別のクエリを実行する必要があります。外部結合を使用して生の SQL でこれが可能であることは知っていますが、django の ORM を使用して実行できますか?

4

2 に答える 2

1

簡単な解決策の 1 つは、カスタム フィルターを作成することです。

{% for j in jobs %}
 {{ j.description }} {% if j|has_applied:user %} (You've already applied) {% endif %}
 {% endfor %}

ここhas_appliedにカスタムフィルターがありuser、パラメーターとして受け取ります。

于 2013-01-22T07:41:13.573 に答える
1

それを行う最も簡単で最も冗長な方法は次のとおりです。

見る

jobs_applied_by_user = set(JobApplication.objects
                                         .filter(applicant=user)
                                         .distinct()
                                         .values_list('job', flat=True))

テンプレート

{% for job in jobs %}
    {% if job.pk in jobs_applied_by_user %}
        …
于 2013-01-22T07:33:59.897 に答える