簡體   English   中英

Django - 將變量從 function 視圖傳遞到 html 模板

[英]Django - passing variable from function view into html template

下午好,我有一個問題,我不知道該怎么做。 我正在使用第三方metar獲取數據,我將其存儲到元變量中並將其作為參數傳遞。 但是它不起作用。 任何幫助將不勝感激。 謝謝。

視圖.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)

索引.html

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

網址.py

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

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

您可以使用渲染 function 來簡化此操作。

例如

from django.shortcuts import render

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

查看您的代碼后,我知道您有兩個視圖作為DashboardView ,這是一個模板視圖和另一個index ,它是基於 function 的視圖(並且您配置不正確)。 在 Urls 中,您已將DashboardView配置為視圖處理程序,而您的實際 api 代碼位於index中,這就是它不起作用的原因。 以下解決方案基於基於 function 的視圖,這可能會有所幫助。

視圖.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)

模板.html

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

網址.py

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index ),
]

我將根據 django 回答您的問題,您將必須弄清楚如何從他們的文檔中獲取來自外部 api 的請求。

根據 django 文檔: 模板視圖的方法流程圖是

  1. 設置()
  2. 派遣()
  3. http_method_not_allowed()
  4. 獲取上下文數據()

現在你正在使用

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM