Django - передача переменной из представления функции в шаблон html - PullRequest
1 голос
/ 26 апреля 2020

Добрый день, у меня проблема, и я не могу понять, как это сделать. Я использую сторонний API для данных, храню его в переменной metar и передаю в качестве аргумента. Однако это не работает. Любая помощь будет оценена. Спасибо.

Views.py

from urllib.request import Request, urlopen
from django.shortcuts import render
from django.http import HttpResponse
from django.views.generic import TemplateView
from django.template.response import TemplateResponse
# Create your views here.
class DashboardView(TemplateView):
    template_name = "index.html"

def index(request, template_name="index.html"):
    headers = {
  'Authorization': 'my_private_api'
    }
    args={}
    request = Request('https://avwx.rest/api/metar/KJFK', headers=headers)
    response_body = urlopen(request).read()
    args['metar'] = response_body
    return TemplateResponse(request,template_name,args)

index. html

{%block content %}
<div>
   <h1>Metary</h1>
   <p>{{ metar }}</p>
</div>
{%endblock content%}

urls.py

from django.urls import path
from . import views
from dashboard.views import DashboardView

urlpatterns = [
    path('', DashboardView.as_view()),
]

Ответы [ 3 ]

0 голосов
/ 26 апреля 2020

После просмотра вашего кода я узнал, что у вас есть два представления как DashboardView, которое является представлением шаблона, и другое index, которое является представлением на основе функций (и вы неправильно настроили его ). В Urls вы настроили DashboardView в качестве обработчика представления, а ваш фактический код API находится в index, поэтому он не работал. Следующее решение основано на представлении функций, это может помочь.

views.py

from django.shortcuts import render
from urllib.request import Request, urlopen

def index(request):
    headers = {'Authorization': 'my_private_api'}
    request = Request('https://avwx.rest/api/metar/KJFK', headers=headers)
    response_body = urlopen(request).read()
    context = {
    'metar':response_body
    }
    return render(request,'index.html',context=context)

template. html

{%block content %}
<div>
   <h1>Metary</h1>
   <p>{{ metar }}</p>
</div>
{%endblock content%}

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index ),
]
0 голосов
/ 26 апреля 2020

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

Согласно django документам: A * 1003 Блок-схема метода TemplateView:

  1. setup ()
  2. dispatch ()
  3. http_method_not_allowed ()
  4. get_context_data ()

теперь вы используете

def index(request, template_name="index.html"):
    headers = {'Authorization': 'my_private_api'}
    args={}
    request = Request('https://avwx.rest/api/metar/KJFK', headers=headers)
    response_body = urlopen(request).read()
    args['metar'] = response_body
    return TemplateResponse(request,template_name,args)

, который не будет работать, поскольку этот def index(... не выполняется вообще. так что у вас ничего нет в вашем контексте metar

поэтому изменение вашего кода на:

class DashboardView(TemplateView):
    template_name = "index.html"

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        #headers = {'Authorization': 'my_private_api'}
        #request = Request('https://avwx.rest/api/metar/KJFK',headers=headers)
        #response_body = urlopen(request).read()

        context['metar'] = 'some information'
        return context

даст вам metar как 'some information' в вашем шаблоне.

0 голосов
/ 26 апреля 2020

Вы можете использовать функцию рендера, чтобы упростить это.

например

from django.shortcuts import render

def index(request, template_name="index.html"):
    return render(request, template_name, {'metar': 'Hello world'})
...