我无法在html中显示该值

时间:2017-10-12 11:42:58

标签: python html django

我无法在html中显示该值。 我在views.py中写道

def score_test(request):
    results = TestScore.objects.filter(user=request.user).all()
    print(results)
    return render(request, 'score_test.html',{'results': results})
在score_test.html

<div class="col-xs-12">
                <h2 class="result_title">Test Score</h2>

                <h3>Your score is 
                 {% for result in results.all %}
                    {% if result.score > 95 %}
                        <h4 class="one"> {{ result.score }} </h4>
                    {% else %}
                        {% if result.score > 80 %}
                             <h4 class="two"> {{ result.score }} </h4>
                    {% else %}
                        {% if result.score > 60 %}
                             <h4 class="three"> {{ result.score }} </h4>
                    {% else %}
                        {% if result.score > 40 %}
                             <h4 class="four"> {{ result.score }} </h4>
                    {% else %}
                             <h4 class="five"> {{ result.score }} </h4>
                    {% endif %}
                    {% endif %}
                    {% endif %}
                    {% endif %}
                 {% endfor %}
                </h3>
            </div>

在models.py

class TestScore(models.Model):
    score = models.FloatField(null=True, blank=True, default=None)

在views.py的print(结果)中,我得到了<function tc at 0x105a15d70>,所以我想我可以在结果中获得TestScore模型的分数。那么,我该如何解决这个问题呢?在score_test.html的模板中写if-else语句我错了吗?

2 个答案:

答案 0 :(得分:1)

“函数tc在0x105a15d70”绝对不是TestCore.objects.filter()应返回的内容(它应该是一个查询集),当然不是你发布的代码可以产生的内容,所以毫不奇怪你没有看到任何内容模板。

据说,您的代码可能会有一些改进......

首先,在您看来:

results = TestScore.objects.filter(user=request.user).all()

.all()是多余的。你只需要:

results = TestScore.objects.filter(user=request.user)

您甚至可以使用反向关系(假设您未在related_name字段中指定TestScore.user):

results = request.user.testscore_set.all()

然后在你的模板中:

             {% for result in results.all %}

“。all”再次无用,可能(或不是)导致您的问题。但是,它没用,所以不要使用它;)

             {% for result in results %}

然后你可以使用{% elif <condition> %} instead of nested {%else%} {%if%}`:

                {% if result.score > 95 %}
                    <h4 class="one"> {{ result.score }} </h4>
                {% elif result.score > 80 %}
                     <h4 class="two"> {{ result.score }} </h4>
                {% elif result.score > 60 %}
                     <h4 class="three"> {{ result.score }} </h4>
                {% elif result.score > 40 %}
                     <h4 class="four"> {{ result.score }} </h4>
                {% else %}
                     <h4 class="five"> {{ result.score }} </h4>
                {% endif %}

但使用custom template filter会使您的代码更简单:

  # <yourapp>/templatetags/<yourlibname>.py

  from django import template
  register = template.Library()

  @register.filter
  def score_grade(score):
      try:
          score = int(score)
      except (TypeError, ValueError):
          # XXX should at least log the exception
          return ""

      if score > 95:
          return "one"
      elif score > 80:
          return "two"
      elif score > 60:
          return "three"
      elif score > 40:
          return "four"
      else:
          return "five"

并在您的模板中:

{% load <yourlibname> %}

{% for result in results %}
  <h4 class="{{ result.score|score_grade }}"> {{ result.score }} </h4>
{% endfor %}

答案 1 :(得分:0)

您可以使用elif命令。

{% if result.score > 95 %}
    <h4 class="one"> {{ result.score }} </h4>
{% elif result.score > 80 %}
    <h4 class="two"> {{ result.score }} </h4>
...
{% else %}
    <h4 class="five"> {{ result.score }} </h4>
{% endif %}