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”作为参数,并且不允许在模板中传递参数。

现在我有两个问题:

我可以创建一个“上下文”,以便某些函数可以假设特定用户有问题,而不是显式传递并限制其在模板中的使用?如果不可能,那么在视图中的模型对象中注释此信息的优雅方法是什么?

其次,即使我能够做到这一点,对于每个 Job 对象,我仍然必须执行单独的查询来确定用户是否已经申请。我知道这在使用外部连接的原始 SQL 中是可能的,但是我可以使用 django 的 ORM 来做到这一点吗?

4

2 回答 2

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 回答
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 回答