【发布时间】:2016-11-28 06:38:24
【问题描述】:
我有一个反复出现的问题,我似乎无法充分解决。我的网站类似于工作网站,人们可以在其中发布工作(以及其中的详细信息),其他人可以为它们添加书签。显然,每个作业都可以被多个查看者收藏。
这是model.py:
class Job(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=150)
description = models.CharField(max_length=5000)
class Bookmark(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
job = models.ForeignKey(Job, on_delete=models.CASCADE)
我的目的是在主页上显示所有工作,这意味着来自多个用户的多个工作。其他用户可以点击一个小书签图标来添加书签,或者取消添加书签。像这样:
这是 view.py:
def index(request):
context = {}
populateContext(request, context)
jobs = Job.objects.all().order_by('-id')
context = {'jobs': jobs}
return render(request, 'templates/index.html', context)
我觉得很简单,这是我的意图。以下是模板的外观:
{% for job in jobs %}
<div>
{{ job.title }}<br>
{{ job.description }}<br>
by {{ job.user.username }}
</div>
{% endfor %}
我的问题是,如何显示特定于每个用户的书签状态?这是我目前的解决方案:
{% for job in jobs %}
<div>
{{ job.title }}<br>
{{ job.description }}<br>
by {{ job.user.username }}<br>
{% for watch in job.bookmark_set.all %}
{% if watch.user_id = request.user.id %}
You have bookmarked this! <a>Unbookmark!</a>
{% endif %}
{% endfor %}
<a>Bookmark</a>
</div>
{% endfor %}
“取消书签!”顺便说一下,链接将定位在“书签”链接上。上面的解决方案就是这样工作的,因为书签表将包含零个或多个特定作业的书签,但在多个用户下。我将在 view.py 中处理这个问题,只过滤登录用户所做的工作。但我无法具体过滤哪个作业,因为 index.html 将显示它们全部。例如,我可以把它吐出来……:
bookmarked = Bookmark.objects.all().filter(user_id=request.user.id)
...这将列出登录用户所做的不同作业的所有书签。我仍然需要在模板中对其进行过滤,以便每个项目与每个书签匹配,我知道这是不可能的。
无论如何,我认为这是非常低效的。所以我想知道是否有更简单的方法来处理这个问题?最好这样工作:
{% for job in jobs %}
<div>
{{ job.title }}<br>
{{ job.description }}<br>
by {{ job.user.username }}<br>
{% if job.id = bookmark.job.id %}
You have bookmarked this! <a>Unbookmark!</a>
{% else %}
<a>Bookmark</a>
{% endif %}
</div>
{% endfor %}
谢谢!
【问题讨论】:
标签: django django-models django-templates django-views