Django Boolean Field在模板中返回False,而它实际上是True

时间:2016-02-07 19:57:15

标签: python django django-models django-templates boolean

这是我的models.py:

class Sherlock(models.Model):
    owner = models.ForeignKey(Owner)
    wifi = models.BooleanField('Wifi', default=False)

这是我的views.py,其中不仅包含一个上下文:

class OwnerDetails(generic.DetailView):
    template_name ='owners/venuedetails.html'
    model = Owner

    def get_context_data(self, **kwargs):
        context = super(OwnerDetails, self).get_context_data(**kwargs)

        self.pk = Owner.objects.get(pk=self.kwargs['pk'])
        featurete_list = FeatureteImage.objects.filter(owner=self.pk)
        context['featurete_list'] = featurete_list

        sherlock = Sherlock.objects.filter(owner=self.pk)
        context['sherlock'] = sherlock
        return context

这是我的模板:

{% if sherlock.wifi %}
    <p>Wifi</p>
{% else %}
    <p><s>Wifi</s></p>
{% endif %} 

当我去/ admin我有wifi检查。但我总是得到一个交叉的wifi(模板中的<s>标签创建了交叉的wifi)

我的问题是,即使在我的管理员中我检查并保存了wifi字段,它仍然会向模板返回false。

1 个答案:

答案 0 :(得分:2)

视图和模板中的这些行不匹配。

sherlock = Sherlock.objects.filter(owner=self.pk)

{% if sherlock.wifi %}

您无法访问查询集上的wifi属性,您可以在实例上访问它。

如果查询集可能包含多个项目,则可以遍历模板中的实例。

{% for s in sherlock %}
    {% if s.wifi %}
    Wifi
    {% endif %}
{% endfor %}

如果查询集只返回单个实例,那么您可以使用get()代替filter()

sherlock = Sherlock.objects.get(owner=self.pk)

您可以对此进行改进以处理对象不存在的情况

try:
    sherlock = Sherlock.objects.get(owner=self.pk)
except Sherlock.DoesNotExist:
    # do something here

有时,get_object_or_404快捷方式对此非常有用。

sherlock = get_object_or_404(Sherlock, owner=self.pk)

最后,请注意,无需在模板中与True进行比较,只需使用

即可
{% if sherlock.wifi %}