You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中将HTML表单变量传递给Python函数并返回API结果

解决Django表单传值并展示API结果的问题

别担心,新手遇到这种问题太正常了!我刚学Django的时候也卡过类似的点,咱们一步步来把这个流程打通:


第一步:修正你的HTML模板(index.html)

首先你的表单输入框缺了name属性,Django的POST请求是通过name来获取值的,所以先补上:

<form action="" method="post"> 
    {% csrf_token %} 
    <input type="text" class="form-control" id="city" name="city" placeholder="输入城市名" value=""> 
    <input type="submit" value="获取天气"> 
</form>

<!-- 用来展示温度结果的区域 -->
{% if temperature %}
    <h3>当前温度:{{ temperature }}℃</h3>
{% endif %}

<!-- 如果有错误提示也可以加在这里 -->
{% if error %}
    <p style="color:red;">{{ error }}</p>
{% endif %}

这里把action="#"改成空字符串,这样提交后会回到当前页面,方便展示结果。


第二步:在views.py里处理表单提交和API请求

你原来把API请求写在forms.py里不太对,Django里业务逻辑(比如调用API)应该放在视图函数里。先修改views.py:

from django.shortcuts import render
import requests

def index(request):
    temperature = None
    error = None
    # 处理POST请求(表单提交)
    if request.method == 'POST':
        # 获取表单里的城市名
        city = request.POST.get('city')
        if city:
            try:
                # 调用天气API
                api_address = 'http://api.openweathermap.org/data/2.5/weather?appid=你的KEY&q='
                url = api_address + city.strip()
                json_data = requests.get(url).json()
                # 解析温度并转成摄氏度
                kelvin = json_data['main']['temp']
                temperature = round(kelvin - 273.15, 0)
            except KeyError:
                # 城市不存在或者API返回错误的情况
                error = "抱歉,找不到这个城市的天气信息,请检查城市名!"
            except requests.exceptions.RequestException:
                # 网络请求失败的情况
                error = "网络连接失败,请稍后重试!"
    # 把温度或错误信息传给模板
    return render(request, 'index.html', {'temperature': temperature, 'error': error})

这里加了异常处理,避免因为输入错误或者网络问题导致页面崩溃,对新手友好很多。


第三步:配置URL路由(urls.py)

确保你的项目或应用的urls.py里有对应的路由:

from django.urls import path
from . import views

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

这样访问根路径就会触发index视图函数。


关于forms.py的补充说明

你原来的forms.py写法不太符合Django的表单规范,如果你想使用Django的表单类来做验证(比如检查输入不为空),可以这样写forms.py:

from django import forms

class WeatherForm(forms.Form):
    city = forms.CharField(label='城市名', max_length=100, required=True)

然后在views.py里改用表单类:

from django.shortcuts import render
import requests
from .forms import WeatherForm

def index(request):
    temperature = None
    error = None
    form = WeatherForm()
    if request.method == 'POST':
        form = WeatherForm(request.POST)
        if form.is_valid():
            city = form.cleaned_data['city']
            # 后面的API请求逻辑和之前一样...
    return render(request, 'index.html', {'form': form, 'temperature': temperature, 'error': error})

对应的模板也要改成用表单类渲染:

<form action="" method="post"> 
    {% csrf_token %} 
    {{ form.as_p }}
    <input type="submit" value="获取天气"> 
</form>

不过对于新手来说,先从第一种不用表单类的方式入手,理解流程后再用Django的表单类会更清晰。


这样一步步做完,你提交城市名后,就能在页面上看到对应的温度啦!如果还有问题,随时问~

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:09:07