Django перебирает словарь и отображает шаблон

avatar
marv8569
8 августа 2021 в 20:53
48
2
0

Этот код дает мне вывод, который мне нужен на терминале, но когда я пытаюсь отобразить его в шаблоне, он дает мне только последний результат. Я прочитал пару других ответов, но ничего не помогает мне понять, где ошибка. Спасибо.

def forecast(request):
    if request.method == 'POST':
        city = urllib.parse.quote_plus(request.POST['city'])

        source = urllib.request.urlopen('http://api.openweathermap.org/data/2.5/forecast?q='+ city +'&units=metric&appid=ab3d24d85590d1d71fd413f0bcac6611').read()

        list_of_data = json.loads(source)
        pprint.pprint(list_of_data)

        forecast_data = {}

        for each in list_of_data['list']:

            forecast_data['wind_speed'] =  each["wind"]['speed']
            forecast_data['wind_gust'] =  each["wind"]['gust']
            forecast_data['wind_deg'] =  each["wind"]['deg']
            forecast_data["coordinate"] =  str(list_of_data['city']['coord']['lon']) + ', ' + str(list_of_data['city']['coord']['lat'])
            forecast_data["name"] =  list_of_data["city"]["name"]
            forecast_data["dt_txt"] =  each["dt_txt"]

            # uncomment for see the result in the terminal
            print(forecast_data)


        fore = {'forecast_data':forecast_data}


    else:
        list_of_data = []
        fore = {}

    return render(request, "WindApp/forecast.html",fore)

и это часть HTML:

<div class="row">
  {% for x,y in forecast_data.items %}
  <div class="col d-flex justify-content-center" ">
    <div id="output" class=" card text-black bg-light mb-6">
    <div id="form" class=" card-body">
      <h4><span class="badge badge-primary">City:</span> {{forecast_data.name}}</h4>
      <h4><span class="badge badge-primary">Coordinate:</span> {{forecast_data.coordinate}}</h4>
      <h4><span class="badge badge-primary">Day/Time:</span> {{forecast_data.dt_txt}}</h4>
      <h4><span class="badge badge-primary">Wind Speed: </span> {{forecast_data.wind_speed}} Kt</h4>
      <h4><span class="badge badge-primary">Wind Gust : </span> {{forecast_data.wind_gust}} Kt  <img src="{% static 'img/wind.png' %}" width="64" height="64" alt="wind"></h4>
      <h4><span class="badge badge-primary">Wind direction : </span> {{forecast_data.wind_deg}}  <img src="{% static 'img/cardinal.png' %}" width="64" height="64" alt="dir"></h4>
    </div>
  {% endfor %}
Источник

Ответы (2)

avatar
Mark R.
8 августа 2021 в 21:19
2

Вы перебираете список прогнозов, но перезаписываете один словарь последним, который видите в цикле.

Вы хотите собрать проанализированные результаты в списке словарей, например:

   all_forecasts = []
   for each in list_of_data['list']:
        forecast = {}
        forecast['wind_speed'] =  each["wind"]['speed']
        # ... etc .. all other fields
        all_forecasts.append(forecast)
   fore = {'forecast_data': all_forecasts}

Позже в шаблоне вам нужно будет перебрать forecast_data и отобразить строку для каждого:

{% for forecast in forecast_data %}
    <div class="row">
      <div><span>City:</span><span>{% forecast.city %}</span></div>
      <!-- etc the other fields -->
    </div>
{% endfor %}
   
avatar
Shamsiddin Parpiev
8 августа 2021 в 21:18
0

Записать пользовательский фильтр в теги шаблона каталога

from django import template

register = template.Library()


@register.filter
def get_list(querydict, item):
    return querydict.getlist(item)

затем импортируйте его в шаблон и используйте следующим образом

{% load get get_list range %}
{% for x,y in forecast_data|get_list:"items" %}

Причина: если у вас есть элементы в контексте, я имею в виду не в прогнозе_данных, Jinja может это понять, но если у вас есть вложенный объект, я имею в виду тип списка (в вашем случае элементы) в каком-то другом объекте, Jinja не может получить доступ к списку