尝试遍历 django 模板中的嵌套字典

Posted

技术标签:

【中文标题】尝试遍历 django 模板中的嵌套字典【英文标题】:Trying to iterate through a nested dictionary in django template 【发布时间】:2021-12-20 07:00:09 【问题描述】:

我正在尝试通过 django 模板中的字典和 for 循环内部使用 for 循环,我试图嵌套另一个 for 循环以循环显示数量以显示产品的许多图像 -

模板是这样的-

% for product_id, item in b_data.items %
    % for i in item.numItems %
        <div class="col-md-4 mb-4">
            <div class="card" style="width: 18rem;">
                <img src="/media/item.image" class="card-img-top" >
                <div class="card-body">
                <h5 class="card-title">item.title</h5>
                <p class="card-text">product_id item.qty</p>
                    <div class="card-footer">
                        <a href="#" class="btn btn-primary"><i class="bi bi-cart2"></i></a>
                    </div>
                </div>
            </div>
        </div>
    % endfor %
% endfor %

views.py 如下所示 -

def make_your_box(request):
    box_p = 
    box_p[str(request.GET['id'])]=
        'image':request.GET['image'],
        'title':request.GET['title'],
        'qty':request.GET['qty'],
        'price':request.GET['price'],
        'numItems': list(range(1, int(request.GET['qty'])+1)),
    
    print(box_p)
    
    if 'boxdata' in request.session:
        if str(request.GET['id']) in request.session['boxdata']:
            box_data=request.session['boxdata']
            box_data[str(request.GET['id'])]['qty']=int(box_data[str(request.GET['id'])]['qty'])+1
            box_data[str(request.GET['id'])]['numItems']=list(range(1,int(box_data[str(request.GET['id'])]['qty'])+1)),
            box_data.update(box_data)
            request.session['boxdata']=box_data
        else:
            box_data=request.session['boxdata']
            box_data.update(box_p)
            request.session['boxdata']=box_data
    else:
        request.session['boxdata']=box_p
    print(request.session['boxdata'])
    print(len(request.session['boxdata']))
    x = 0    
    for prodid, item in request.session['boxdata'].items():
        x = x + int(item['qty'])
    print(x)    
    t_box=render_to_string('ajax/TestSelect1_1.html','b_data':request.session['boxdata'])
    return JsonResponse('b_data':t_box)

即使在打印stmts输出正确的输出在命令提示符下如下图-

[06/Nov/2021 23:05:30] "GET /TestSelect1 HTTP/1.1" 200 13945
[06/Nov/2021 23:05:30] "GET /media/product_imgs/IMG_0910.JPG HTTP/1.1" 200 3462312
'5': 'image': 'product_imgs/RedCookies.jpg', 'title': 'Strawberry Cookies', 'qty': '1', 'price': '10', 'numItems': [1]
'5': 'image': 'product_imgs/RedCookies.jpg', 'title': 'Strawberry Cookies', 'qty': '1', 'price': '10', 'numItems': [1]
1
1
[06/Nov/2021 23:05:37] "GET /make_your_box?id=5&qty=1&title=Strawberry%20Cookies&price=10&image=product_imgs%2FRedCookies.jpg HTTP/1.1" 200 619
'5': 'image': 'product_imgs/RedCookies.jpg', 'title': 'Strawberry Cookies', 'qty': '1', 'price': '10', 'numItems': [1]
'5': 'image': 'product_imgs/RedCookies.jpg', 'title': 'Strawberry Cookies', 'qty': 2, 'price': '10', 'numItems': ([1, 2],)
1
2
[06/Nov/2021 23:05:49] "GET /make_your_box?id=5&qty=1&title=Strawberry%20Cookies&price=10&image=product_imgs%2FRedCookies.jpg HTTP/1.1" 200 619
'6': 'image': 'product_imgs/IMG_0903.JPG', 'title': 'Decoupage', 'qty': '1', 'price': '20', 'numItems': [1]
'5': 'image': 'product_imgs/RedCookies.jpg', 'title': 'Strawberry Cookies', 'qty': 2, 'price': '10', 'numItems': [[1, 2]], '6': 'image': 'product_imgs/IMG_0903.JPG', 'title': 'Decoupage', 'qty': '1', 'price': '20', 'numItems': [1]
2
3
[06/Nov/2021 23:06:51] "GET /make_your_box?id=6&qty=1&title=Decoupage&price=20&image=product_imgs%2FIMG_0903.JPG HTTP/1.1" 200 1213
'6': 'image': 'product_imgs/IMG_0903.JPG', 'title': 'Decoupage', 'qty': '1', 'price': '20', 'numItems': [1]
'5': 'image': 'product_imgs/RedCookies.jpg', 'title': 'Strawberry Cookies', 'qty': 2, 'price': '10', 'numItems': [[1, 2]], '6': 'image': 'product_imgs/IMG_0903.JPG', 'title': 'Decoupage', 'qty': 2, 'price': '20', 'numItems': ([1, 2],)
2
4
[06/Nov/2021 23:06:54] "GET /make_your_box?id=6&qty=1&title=Decoupage&price=20&image=product_imgs%2FIMG_0903.JPG HTTP/1.1" 200 1213

但是模板没有按预期显示那么多图像,看起来它没有循环遍历上面粘贴的模板中提到的 item.numItems - 任何专家都可以看看解释可能发生的事情......

非常感谢。

【问题讨论】:

【参考方案1】:

你的内部for循环格式会导致错误的结果:

% for i in &gt;&gt;&gt;item.numItems&lt;&lt;&lt; %

您应该将其更改为 range for 循环。像这样:

% for i in '0123456789'|make_list %
     i 
% endfor %

或者像这样:

% for i in range(item.numItems) %
     i 
% endfor %

阅读更多:using numeric for loop in a Django template

【讨论】:

以上是关于尝试遍历 django 模板中的嵌套字典的主要内容,如果未能解决你的问题,请参考以下文章

如何遍历 django 模板中的嵌套字典

如何遍历 Django 模板中的字典?

Django模板访问嵌套数据

显示 % forloop% 的键和值的 Django 模板:如何遍历模板中的字典?

如何在 Django 模板中多次遍历同一个字典?

Django模板遍历字典的方法