Как отобразить выходные данные из функции в шаблоне Django? - PullRequest
0 голосов
/ 28 января 2019

Функция индекса извлекает строку из 'n url и печатает желаемый вывод в терминал.Как настроить мои представления так, чтобы они отображали данные на моей HTML-странице индекса?

Это приложение для погоды, которое должно извлекать данные из URL-адреса и отображать их на странице, на которой зарегистрирован пользователь. Я пытался использовать контекст, но я не уверен, как использовать его с даннымиэто возвращается из цикла for.

from django.shortcuts import render
import requests
import json


def index(request):
    url = "http://weather.news24.com/ajaxpro/Weather.Code.Ajax,Weather.ashx"

    headers = {'Content-Type': 'text/plain; charset=UTF-8',
           'Host': 'weather.news24.com',
           'Origin': 'http://weather.news24.com',
           'Referer': 'http://weather.news24.com/sa/capetown',
           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) '
                         'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
           'X-AjaxPro-Method': 'GetForecast7Day'}

    payload = {"cityId": "77107"}

    r = requests.post(url, headers=headers, data=json.dumps(payload))
    weather_data = r.json()

    for forecast in weather_data['value']['Forecasts']:
        print(forecast['ShortWeekDay'] + ':', 'High: ' + forecast['HighTemp'] + 'C',
          'Low: ' + forecast['LowTemp'] + 'C',
          'Wind Speed: ' + forecast['WindSpeed'] + 'Km/h', 'Rainfall: ' + str(forecast['Rainfall']))

    return render(request, 'weather/index.html', )

Ожидаемые результаты будут отображать данные из базы данных или из выходных данных функции.В настоящее время это только печать данных из URL.Я не уверен, с чего начать.Есть идеи?

1 Ответ

0 голосов
/ 28 января 2019

Вы можете просто передать весь список с объектами прогноза и повторить его в своем weather/index.html.

def index(request):
    ....
    context = {
        'forecasts': weather_data['value']['Forecasts']
    }
    return render(request, 'weather/index.html', context)

Поскольку одиночный forecast в вашем weather_data['value']['Forecasts'] также является словарем, вам нужносоздайте шаблонный фильтр , позволяющий вам получить доступ к значениям словаря по ключу внутри словаря через шаблоны django.Я не знаю, почему они не реализовали это до сих пор, так как это общая проблема, но вот что вам нужно:

@register.filter
def get_value(dict, key):
    return dict[key]

Тогда внутри weather/index.html вы можете получить к нему доступ как (я незнаю, что это структура, поэтому я напишу псевдо):

{% for forecast in forecasts %}
    <h1>ShortWeekDay: {{forecast|get_value:"ShortWeekDay"}}</h1>
    <h2>High: {{forecast|get_value:"HighTemp"}}C</h2>
    <h2>Low: {{forecast|get_value:"LowTemp"}}C</h2>
    <h2>Wind Speed: {{forecast|get_value:"WindSpeed"}}Km/h</h2>
    <h2>Rainfall: {{forecast|get_value:"Rainfall"}}</h2>
{% endfor %}
...