【问题标题】:How to access values for a key in a Django template?如何访问 Django 模板中键的值?
【发布时间】:2012-06-07 22:29:36
【问题描述】:

新手问题: 我有一个字典渲染与extra_Context 来自views.py 中定义的方法

我的看法:

 extra_context = {
    'comment': comment
    }
return direct_to_template(request, 'events/comment_detail.html', extra_context)

如果我打印comment,它会像这样打印:

[{'comment': u'first', 'user': 2}, {'comment': u'second', 'user': 2}]

我想将此字典传递给我的模板。我尝试使用以下代码:

       <tbody>
            {% for obj in comment %}
                {% for key,val in obj.items %}
             <tr class="{% cycle 'odd' 'even' %}">
                <td> {{val}}</td>
            </tr>
                {% endfor %}
            {% endfor %}
       </tbody>

打印出来:

first
2
second
2

我要这样:

first  2
second 2

..等等

我应该添加什么才能像上面一样?

更新了!

 def comment_detail(request, object_id):
     comment_obj = EventComment.objects.filter(event = object_id)
     comment = comment_obj.values('comment','user')
     extra_context = {
         'comment': comment
         }
     return direct_to_template(request, 'events/comment_detail.html', extra_context)

comment_detail.html

<form action="" method="POST">
<table>
    <thead>
        <tr><th>{% trans "Comments" %}</th><th>{% trans "Timestamp "%}<th>{% trans "User" %}</th></tr>
    </thead>
    <tbody>
        {% if comments %}
    {% for com in comment %}
                <td> {{com.comment}}</enter code heretd>
                <td> {{com.user}}</td>
    {% endfor %}
    {% else %}
     <td> No comments </td>
     {% endif %}
    </tr>  
    </tbody>
</table>
 </form>

【问题讨论】:

    标签: django django-templates django-views


    【解决方案1】:

    您不需要嵌套的for 迭代k,v。我刚试过这个:

    查看:

    def testme(request):
       comments = []
       comments.append({'user': 2, 'comment': 'cool story bro'})
       comments.append({'user': 7, 'comment': 'yep. cool story'})
    
       extra_context = {
          'comments': comments
       }
    
       return render_to_response('testapp/testme.html', extra_context )
    

    模板:

    {% if comments %}
       <b>Comments:</b>
       <ul>
       {% for comment in comments %}
         <li>{{ comment.comment }} (id {{ comment.user }})</li>
       {% endfor %}
       </ul>
    {% else %}
       <b>No comments</b>
    {% endif %}
    

    【讨论】:

    • 感谢您的回复。但是我必须根据您从数据库中获得的回复附加的数据。请查看更新!问题的一部分:)我刚刚在views.py中发布了方法
    • @AmitPal 渲染模板失败了吗?你能把你得到的错误添加到你刚刚添加的方法下面吗?
    • 我还在更新部分添加了我的模板。使用它会在评论 td 中打印 No cmets
    • @AmitPal 我认为这仅仅是因为变量名不匹配。您在视图中将其称为comment,在您的模板中您将其称为comments
    【解决方案2】:

    "for k(k=key), v(v=value) in object.items"

    这就是说遍历每个键值对,例如 object.items 中的 name = models.CharField(max_length=50)。您的视图返回了 object.items 的上下文,其中每个项目都是一个模型实例,并且有一组与之关联的 k,v 对。

    【讨论】:

      【解决方案3】:

      看起来你的问题只是关于 html 标记。 试试这个:

      <tbody>
          {% for obj in comment %}
              <tr class="{% cycle 'odd' 'even' %}">
                  {% for key,val in obj.items %}          
                      <td>{{val}}</td>       
                  {% endfor %}
              </tr>
          {% endfor %}
      </tbody>
      

      或者这个:

      <tbody>
          {% for obj in comment %}
              <tr class="{% cycle 'odd' 'even' %}"><td>
                  {% for key,val in obj.items %}          
                       {{val}}<span> </span>  
                  {% endfor %}
              </td>  </tr>
          {% endfor %}
      </tbody>
      

      【讨论】:

      • 你看到我做了同样的事情吗?你检查过模板部分写的代码吗
      • 而你的答案是错误的。它只打印注释键的值而不是用户键的值。请看问题
      • 嗯,你写了I want in this way: first 2 second 2。所以我想,你想在 html 输出的同一行上打印 first2。为此我修改了模板代码...
      • 我认为它给你造成了困惑:P,
      • 再看@stalk 的回答。这和你做的不一样。 {% for key,val in obj.items %} 部分位于一行(&lt;tr&gt; 标签)内,这就是您想要的。在您的情况下,每行都有一个值,因为“for”模板标签在行标签之外。再看一遍……
      猜你喜欢
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2021-04-10
      • 2019-05-24
      • 2011-07-11
      相关资源
      最近更新 更多