如何在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
相关产品推荐
相关产品推荐

