如何从Django模板中的JSON文件访问属性元素?

时间:2019-03-01 04:19:10

标签: python django

我正在解析一个JSON文件,该文件位于远程,并且会不断用新数据进行更新。我不会编写JSON文件的整个结构,因为它太多了。到目前为止,我可以在模板上获取并显示名称和图像,这很简单,但是我不知道如何使用属性前导下划线< / strong>。

让我们看一下JSON文件的一部分:

[{ 'searchResult' : [{'@count': '5',

'item': [{ 

           'itemId': ['352565431707'],

           'title': ['Smart Tab ST8200 Quad-core 7" HD Tablet Android 8.1 Oreo 8GB'],

           'galleryURL': ['http://thumbs4.flickr.com/m/maf6ZygaFcxqMsVv2DQTh6g/140.jpg'],

           'sellingStatus': [{'currentPrice': [{'@currencyId': 'USD', '__value__': '49.0'}],

           'itemURL': ['http://rover.somewebsite.com?item=352565431707']}]

'item': [{ 

       'itemId': ['352565431808'],

       'title': ['iPhone 11 latest phone '],

       'galleryURL': ['http://thumbs4.flickr.com/m/maf6ZygaFcxqMsVv2DQOm6g/140.jpg'],

       'sellingStatus': [{'currentPrice': [{'@currencyId': 'USD', '__value__': '1200.0'}],

       'itemURL': ['http://rover.somewebsite.com?item=352565431808']}]

这是我在 views.py

中的代码的一部分
    url = 'http://svcs.somewebsite.com?RESPONSE-DATA-FORMAT=JSON&keyword=something'
    r =  requests.get(url).json()

    search =r['searchResult'][0]['item']

    context = { 'items': search }
    template='home.html'
    return render(request, template, context)

这是我在 home.html 模板

中的代码的一部分
{% for item in items %}
  <a href = "{‌{ item.itemURL.0 }} />             
    <img src="{‌{ item.galleryURL.0 }}" alt="{‌{ item.title.0 }}" />
  </a>
  <h2>{‌{ item.title.0 }}</h2> 
  <h3>{‌{ item.sellingStatus.0.currentPrice.0.__value__.0 }}</h3>                           
{% endfor %}

根据我所拥有的内容,它会渲染图像和标题,但是当我尝试访问 __ value __ 时,由于下划线的原因,我收到一条错误消息,说实话我不知道如果我通过这种方法正确地访问属性。回到我的问题,在这种情况下如何访问属性,以及如何避免使用下划线?非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

朋友,您必须使用FOR循环中声明的相同变量。您必须使用项目变量而不是项目。从技术上讲,该区域中不存在项目:

{% for item in items %}

   <a href="{{item .viewItemURL.0}}">    
     <img src="{{ item .galleryURL.0 }}" alt="{{ item .title.0 }}" />
   </a>
   <p>Names: {{ item .title.0 }}</p> 

{% endfor %}

答案 1 :(得分:0)

朋友,您设法解决问题了吗? 如果没有,可能更简单的解决方案是使用javascript。 尝试以某种方式将标记变量{{items}}存储在javascript变量中。

for (let item in variableItems){
    let currentPrice = variableItems[item].sellingStatus[0].currentPrice[0];
    console.log(currentPrice['@currencyId'];
    console.log(currentPrice['__value__'];
}

完成此操作后,便会根据需要使用值。


另一种可能的解决方案是在后端删除@字符和__(因为@字符在模板中产生问题)。您可以使用替换功能。 str.replace('@', '')和str.replace('__',))

y en la pantilla html:

{{ item.sellingStatus.0.currentPrice.0.currencyId}}

{{ item.sellingStatus.0.currentPrice.0.value}}

答案 2 :(得分:0)

因为我喜欢与世界分享我所知道的东西,所以这是我自己问题的答案。经过研究并摸索了好几天后,我想到了这个解决方案,该解决方案非常适合我的情况。

为了访问属性元素和下划线,我必须清理视图中的数据并在视图中进行迭代。我创建了四个变量容器,可用于附加该迭代的每个结果。如果不这样做,最终将只能得到模板中迭代的最后结果。

就在那里。非常感谢JoséEras的帮助。 Muchas graciasJosépor tratar de ayudarme!