Django - 将变量从函数视图传递到 html 模板

Posted

技术标签:

【中文标题】Django - 将变量从函数视图传递到 html 模板【英文标题】:Django - passing variable from function view into html template 【发布时间】:2020-08-09 23:28:16 【问题描述】:

下午好,我有一个问题,我不知道该怎么做。我正在使用第三方 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()),
]

【问题讨论】:

【参考方案1】:

我将用 django 回答你的问题,你必须弄清楚如何从他们的文档中获取来自外部 api 的请求。

根据 django 文档:A TemplateView's Method Flowchart is

    设置() 调度() http_method_not_allowed() 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' 提供给您。

【讨论】:

【参考方案2】:

你可以使用渲染函数来简化这个。

例如

from django.shortcuts import render

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

【讨论】:

我做到了,但是当我在 index.html 中传递 metar 时,我什么也没得到。 您的“def index”视图不在您的urlpatterns 中?所以它使用DashboardView 代替。尝试在那里添加它而不是DashboardView【参考方案3】:

查看您的代码后,我知道您有 两个视图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)

模板.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 ),
]

【讨论】:

我没有测试它,因为它包含 api 调用,但如果你有任何错误,请告诉我。

以上是关于Django - 将变量从函数视图传递到 html 模板的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量从 CLI 程序传递到 Python 视图以更新 Django UI?

将变量从视图传递到表单 Django

如何从 Django 视图将变量传递给 SCSS

将HTML表单变量传递给Django中的python函数

如何使用web3.py将参数从Django视图传递给契约函数

如何将变量从 python Django 传递到 HTML 模板