如何防止被阻止的用户出现在此用户列表中?

时间:2013-08-16 23:22:25

标签: django django-models django-templates

Django和编程菜鸟在这里。我正在制作一个选举信息应用程序,在选举页面上,我想显示所有在选举中运行的候选人,但我想要显示候选人哪个主持人选举已宣布被封锁的用户。

我可以使用{%for candidate in election.candidate_set.all%}来显示在选举中运行的所有候选人的列表。但是,我想首先检查候选者是否是blocked_user,并且只显示候选者(如果他们不是blocked_user)。正如您在下面的模板中看到的那样,我认为我可以使用{%if candidate in election.blocked_users.all%}中的语句,但这对我不起作用......

抱歉,我是一个菜鸟。任何帮助将不胜感激。

election_detail.html

{% for candidate in election.candidate_set.all %}
    {% if candidate in election.blocked_users.all %}
        <!--do nothing-->
    {% else %}    
    <h3>{{ candidate.name }}</h3>
    {% endif %}
{% endfor %}

models.py

class Election(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField()
    first_voting_day = models.DateField()
    last_voting_day = models.DateField(null=True, blank=True)
    constituency = models.ForeignKey(Constituency)
    offices = models.ManyToManyField(Office)
    moderators = models.ManyToManyField(User, related_name='moderator')
    blocked_users = models.ManyToManyField(User, related_name='blocked_users', blank=True)

    def __unicode__(self):
        return unicode(self.name)

    def get_absolute_url(self):
        return reverse('election_detail', kwargs={'pk': str(self.id)})

编辑 - 添加了选举视图

election.py

class ElectionDetailView(DetailView):
    model = Election
    context_object_name = "election"

2 个答案:

答案 0 :(得分:1)

这种过滤应该在控制器中完成。在将查询传递给模板之前,请在查询中过滤掉不合适的候选项。

答案 1 :(得分:0)

这应该在您的视图中选择与选举没有阻止用户关系的所有候选人。

eligible_candidates = election.candidate_set.exclude(id__in = election.blocked_users.all().values_list('id'))

然后在你的模板中

{% for candidate in eligible_candidates %}
<h3>{{ candidate.name }}</h3>
{% endfor %}

如果经常使用此过滤(DRY),则可以将此过滤移至模型或模型管理器上的方法。