У меня есть Django веб-сайт, и я звоню в Etsy's API для отображения продуктов на веб-сайте. Данные имеют несколько уровней (сокращенно ниже):
{
"results":[
{
"title":"#020",
"price":"5.99",
"Images":[
{
"url_570xN":"www.example.com/image1.jpg"
}
]
},
{
"title":"#051",
"price":"5.99",
"Images":[
{
"url_570xN":"www.example.com/image2.jpg"
}
]
},
]
}
Я могу успешно извлечь данные из части results
(title
, price
) и отобразить их в шаблоне, но я не могу ' не могу понять, как сделать то же самое для части Images
(url_570xN
). Я потратил несколько часов, пытаясь найти правильный синтаксис, но мне это не удалось.
Мой views.py
:
# Note: The commented lines are the ones giving me problems.
# Removing them yields no errors and displays the info I want,
# minus the images
def products(request):
parsed_data = []
response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
etsy_data = response.json()
etsy_results = etsy_data['results']
# etsy_images = etsy_data['results']['Images']
for results in etsy_results:
result_data = {}
result_data['title'] = results['title']
result_data['price'] = results['price']
# for Images in etsy_images:
# result_data['url_570xN'] = Images['url_570xN']
parsed_data.append(result_data)
return render(request, 'blog/products.html', {'data' : parsed_data})
Мой products.html
шаблон:
{% for result in data %}
<p>Title: {{result.title}}
Price: {{result.price}}
<img src={{result.url_570xN}} width="200px"></p>
{% endfor %}
И, наконец, сообщение об ошибке, которое я получаю, когда раскомментирую строки в моем views.py
:
TypeError at /products/
list indices must be integers or slices, not str
Любая помощь будет принята с благодарностью. Спасибо!
РЕДАКТИРОВАТЬ 1: Вот полный ответ на то, что у меня есть выше:
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/products/
Django Version: 2.2.4
Python Version: 3.7.4
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog.apps.BlogConfig',
'crispy_forms',
'django_summernote']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
34. response = get_response(request)
File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
115. response = self.process_exception_by_middleware(e, request)
File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
113. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/blog/views.py" in products
21. etsy_images = etsy_data['results']['Images']
Exception Type: TypeError at /products/
Exception Value: list indices must be integers or slices, not str
РЕДАКТИРОВАТЬ 2: Я изменил свой views.py
следующим образом, основываясь на ответе Тома Каррика. Все работает сейчас, большое спасибо!
parsed_data = []
response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
etsy_data = response.json()
etsy_results = etsy_data['results']
for results in etsy_results:
result_data = {}
result_data['title'] = results['title']
result_data['price'] = results['price']
result_data['url_570xN'] = results['Images'][0]['url_570xN']
parsed_data.append(result_data)
return render(request, 'blog/products.html', {'data' : parsed_data})