【问题标题】:Django template if statement always evaluates to trueDjango 模板 if 语句总是计算为 true
【发布时间】:2012-10-25 23:00:23
【问题描述】:

这看起来应该很简单,但由于某种原因我无法解决这个问题。我正在使用 Django 1.4。我正在尝试进行基本检查以查看 list QuerySet 在模板渲染期间是否为空,但我使用的 if 语句似乎总是评估为 true。

我有一个 Django 模板,上面写着:

{% extends 'includes/base.html' %}

{% if object_list %}
...
{% block data %}
   {% for object in object_list %}
     ...
     {{ object.create_date }}
     ...
   {% endfor %}
{% endblock data %}
...
{% endif %}

'base.html' 有块:

<body>
{% block content %}
  ...   
  <div class="row-fluid">
    <div class="span12">
      {% block data %}
      <div align="center"><i>No data.</i></div>
      {% endblock data %}
    </div><!-- span12 -->
  </div><!-- row -->
{% endblock content %}
...
</body>

生成QuerySet的视图函数在这里:

def barcode_track(request, model):
    query = request.GET.get('barcode_search', '')
    object_list = model.objects.all()
    if query:
        object_list = model.objects.filter(barcode__icontains=query)
    return render_to_response('barcode_track/barcode_list.html',
                              {'object_list': object_list, 'query': query},
                              context_instance=RequestContext(request))

通过这种形式调用:

<form id="barcode_search_form" method="get" action="" class="form">
    <input type="text" name="barcode_search" value="{{ query }}" />
    <button type="submit" class="btn">Search</button>
</form>

还有 urls.py 行:

urlpatterns = patterns('barcode_track.views',
                       url(r'^$', 'barcode_track', {'model': Barcode},
                           name="barcode_track"),)

这个想法是,只有在object_list 中存在结果时才会显示结果,否则父块将保持不变。我已经尝试更改object_list 的名称,并且我已将{{ dicts }} 打印到页面以确保object_list 实际上是空的(它是)。我没有使用通用视图,尽管我意识到这个名字暗示了很多。实际上,我在使用类似逻辑编写的另一个应用程序中遇到了这个问题,所以我一定是在系统地错误地做某事。

我在这里错过了什么?

【问题讨论】:

  • object_list 是 Python 的 list 还是其他一些数据结构?
  • 你是如何生成object_list的?
  • 我没想到; object_list 在技术上是一个 Django QuerySet(来自 SomeModel.objects.filter() 或 .all())
  • 您能否将view function 也添加到您的问题中?这将有助于在您的 view function 中准确了解您是如何构建您的 queryset
  • 是的,查看功能会很有帮助。请做

标签: django templates if-statement block conditional-statements


【解决方案1】:

您不能将if 之类的控制流标签包裹在block 周围。您的问题是子模板对块 data 的定义被使用只是因为它在那里。

您可以通过将if 标签放在block data 中来修复它。如果要在列表为空时继承父级的内容,请添加扩展为 {{ block.super }}else 大小写。

【讨论】:

  • 啊!这样做。谢谢大家的帮助!
猜你喜欢
  • 2010-12-15
  • 2013-11-23
  • 2016-01-04
  • 1970-01-01
  • 2015-12-16
  • 2016-05-10
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多