【问题标题】:Nested for loop in Django Template not able to loop through a dictionary itemDjango模板中的嵌套for循环无法遍历字典项
【发布时间】:2021-01-18 22:36:42
【问题描述】:

我正在尝试构建的一个小型电子商务项目的一部分。

显示 order_info 的 views.py 函数

@login_required
def past_orders_view(request):
    print (request.user)
    allOrders = Order.objects.filter(full_name=request.user)
    return render(request, "orders.html", {'Orders':allOrders})

来自 db 的 allOrders 查询集看起来像,它将显示特定登录用户的订单:

<QuerySet[<Order: 13-{'Zenbook 14': '82990.00', 'iPhone 11 64gb': '61999.00'}-godric-+919871199215>]>

在模板中,我有这样的东西:

<table class="table table-striped">
 <head>
   <tr>
     <th> Ordered Date </th>
     <th> Status </th>
     <th> Product Name </th>
     <th> Price </th>
   </tr>
 </thead>
<tbody>
{% for order in Orders %}
   <tr>
    <td> {{order.date}} </td>
    <td> {{order.status}} </td>
    <td> {{ order.items_json }} </td>
    <td> {{ order.items_json }} </td>
   </tr>
{% endfor %}
</table>

另外,在 view.py 中,Order 的模型对象在下订单时会保存这些信息

order = Order(items_json=items_json, full_name=name, town_or_city=city,                  
              phone_number=phone, status=status, date=timezone.now())
order.save()

所以,full_name、status、date等Order对象可以通过模板中的for循环直接访问,并显示出来根据 HTML 中的需要。有问题的部分是遍历以产品名称为键,以价格为值的字典。 已经尝试过嵌套for循环,没有得到答案。

尝试过的循环示例:

{% for order in Orders %}
   <tr>
    {% for key,value in order.items_json.items %}
       <tr>
        <td> {{order.date}} </td>
        <td> {{order.status}} </td>
        <td> {{ key}} </td>
        <td> {{ value }} </td>
      </tr>
   {% endfor %}
  </tr>
{% endfor %}

需要帮助!!!

【问题讨论】:

  • 呈现的 HTML 中实际出现了什么?服务器控制台有信息吗?
  • 当我尝试循环示例(上述问题的最后一部分)时,它无法显示任何内容。虽然当我显示 order.items_json 时,在通过单个 for 循环遍历 Orders 时,这会显示 {'Zenbook 14': '82990.00', 'iPhone 11 64gb': '61999.00'}
  • 我怀疑order.items_json 实际上是一个字符串而不是字典。我会考虑在您的 Python 代码中将其转换为字典(可能循环通过 orders 并使用真正的字典按顺序分配新属性。
  • 是的!你是对的。在 view.py 中检查了它的类型,发现它是一个带有字典的字符串。在 orders 上的正则表达式的帮助下解决了它,然后使用 eval 将其转换回字典。感谢您指出! :-)

标签: python html django django-templates


【解决方案1】:

或者干脆把这部分变成你的视图,然后在上下文中传递

如果您想在多个位置重复使用它,您可以创建一个简单的自定义模板标签,如提供的here

您的案例示例:

class tuple_to_object:
  def __init__(self, input_tuple):
    self.key = input_tuple[0]
    self.value = input_tuple[1]

def get_key_values(dictionary):
  l = list(dictionary.items())
  return [tuple_to_object(item) for item in l]

...
orders = get_key_values(User.order_set.all()
render(request, 'path/to/view.html', {"orders":orders)})

在你看来:

{% for order in orders %}
  {{order.key}}
  {{order.value}}
{% endfor %}

注意:这不适合您的问题,但方法相同

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2011-10-11
    • 2016-08-31
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多