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 иконки.

Два предложения:

  1. Не переназначайте переменную для обозначения чего-то другого. Вместо этого используйте две разные переменные. Так вместо

            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'
    
  2. Лучше хранить url в каждом словаре:

            weather['icon_url'] = 'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/01d.svg'
    

    Теперь у вас будет url для иконки в каждом городе.

  3. Вы можете построить URL непосредственно из названия иконки без всех операторов if. Сделайте это всего один раз, а не 50 раз:

            weather['icon_url'] = f'https://dar-group-150-holborn.s3.eu-west-2.amazonaws.com/images/{icon}.svg'
    

    Альтернативно, вы можете сделать это непосредственно в шаблоне. Поскольку вы не поделились своим шаблоном, я не могу дать никаких подробностей, кроме этой туманной подсказки.

Вернуться на верх