Django, при переборе иконок openweather всегда отображается последняя иконка вместо добавленной иконки города
Я пытаюсь создать погодное приложение, используя openweather api, и я хочу заменить иконки png на свой собственный набор иконок.
Для этого я обратился к openweather api png кодам, как показано здесь: https://openweathermap.org/weather-conditions. Я написал код, который утверждает, что если этот код равен '01d', то замените код иконки на мое пользовательское изображение данных src.
Проблема в том, что при циклическом просмотре (после добавления города), я всегда добавляю последнее изображение, которое в данном случае является кодом данных для '50n', а не правильным кодом погоды для этого города.
вот код в моем файле views.py:
def weather(request):
url = 'http://api.openweathermap.org/data/2.5/weather?q={}&units=metric&appid=<MYAPPKEY>'
cities = City.objects.all()
weather_data = []
for city in cities:
city_weather = requests.get(url.format(city)).json()
weather = {
'city' : city,
'temperature' : city_weather['main']['temp'],
'description' : city_weather['weather'][0]['description'],
'icon' : city_weather['weather'][0]['icon'],
}
icon = weather['icon']
if icon == '01d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/01d.svg'
elif icon == '01n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/01n.svg'
elif icon == '02d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/02d.svg'
elif icon == '02n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/02n.svg'
elif icon == '03d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/03d.svg'
elif icon == '03n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/03n.svg'
elif icon == '04d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/04d.svg'
elif icon == '04n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/04n.svg'
elif icon == '09d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/09d.svg'
elif icon == '09n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/09n.svg'
elif icon == '10d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/10d.svg'
elif icon == '10n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/10n.svg'
elif icon == '11d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/11d.svg'
elif icon == '11n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/11n.svg'
elif icon == '13d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/13d.svg'
elif icon == '13n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/13n.svg'
elif icon == '50d':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/50d.svg'
elif icon == '50n':
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/50n.svg'
weather_data.append(weather)
context = {'weather_data' : weather_data, 'icon': icon}
return render(request, 'weather/weather.html', context)
Что я делаю неправильно или что-то упускаю?
icon = weather['icon']
Это устанавливает переменную icon
для ссылки на строку внутри словаря.
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/01d.svg'
Это переназначает эту переменную на строку URL. Это НЕ изменяет словарь, как вы могли бы подумать.
context = {'weather_data' : weather_data, 'icon': icon}
После цикла вы устанавливаете единственное значение в context
, которое будет последним url иконки.
Два предложения:
Не переназначайте переменную для обозначения чего-то другого. Вместо этого используйте две разные переменные. Так вместо
icon = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/01d.svg'
сделать
icon_url = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/01d.svg'
Лучше хранить url в каждом словаре:
weather['icon_url'] = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/01d.svg'
Теперь у вас будет url для иконки в каждом городе.
Вы можете построить URL непосредственно из названия иконки без всех операторов if. Сделайте это всего один раз, а не 50 раз:
weather['icon_url'] = f'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/{icon}.svg'
Альтернативно, вы можете сделать это непосредственно в шаблоне. Поскольку вы не поделились своим шаблоном, я не могу дать никаких подробностей, кроме этой туманной подсказки.