如何在Django的一个视图函数中获取另一个视图函数的值?
问题修正与实现方案
你的代码里有几个明显的错误:
- Django视图函数不能直接互相调用(
my_view(context)这种写法完全不对),视图是处理HTTP请求的,必须由路由触发 my_view的参数不符合Django规范,视图第一个参数只能是request,不能自定义context参数my_view1().objects.all()是错误用法,my_view1是普通函数不是模型类,根本没有objects属性JsonResponse用错了,它只能接收一个可序列化的字典或对象,不能传多个参数
针对你要从my_view1传递经纬度到my_view的需求,给你两种实用的实现方案:
方案1:表单隐藏字段传递(适合前后端不分离场景)
如果my_view1是用来渲染页面,把经纬度放到模板的表单隐藏字段里,提交POST请求时一起传给my_view:
1. 改写my_view1函数
from django.shortcuts import render def my_view1(request): # 这里替换成你实际获取经纬度的逻辑,比如从请求参数、数据库读取 latitude = 39.9042 # 示例纬度值 longitude = 116.4074 # 示例经度值 context = {'latitude': latitude, 'longitude': longitude} # 渲染模板,把经纬度传给模板 return render(request, 'coord_form.html', context)
2. 编写模板coord_form.html
在模板里创建表单,把经纬度作为隐藏字段:
<form method="POST" action="{% url 'my_view' %}"> {% csrf_token %} <input type="hidden" name="latitude" value="{{ latitude }}"> <input type="hidden" name="longitude" value="{{ longitude }}"> <button type="submit">获取栅格数据</button> </form>
3. 修正my_view函数
from django.http import JsonResponse from django.views.decorators.http import require_http_methods import rasterio import xarray as xr from rasterio.windows import Window @require_http_methods(["POST"]) def my_view(request): if request.method == "POST": # 从POST请求里取经纬度 latitude = request.POST.get('latitude') longitude = request.POST.get('longitude') # 转成数值类型,因为POST获取的是字符串 try: latitude = float(latitude) longitude = float(longitude) except (ValueError, TypeError): return JsonResponse({'error': '无效的经纬度参数'}, status=400) # 读取栅格文件并处理 xarr = xr.open_rasterio('/home/shaheer07/New Rasters/image_factors.tif') img = xarr[0, :, :] # 注意x对应经度,y对应纬度,还要把xarray对象转成普通数值 pixel_value = img.sel(x=longitude, y=latitude, method="nearest").item() with rasterio.open('/home/shaheer07/New Rasters/image_factors.tif') as f: meta = f.meta rowcol = rasterio.transform.rowcol(meta['transform'], xs=longitude, ys=latitude) y, x = rowcol window = Window(x, y, 1, 1) # 转成列表才能被JSON序列化 raster_values = f.read(window=window).tolist() # 返回JSON响应,必须是字典格式 return JsonResponse({ 'pixel_value': pixel_value, 'raster_values': raster_values }, status=201) return JsonResponse({'error': '请求方法错误'}, status=405)
4. 配置路由
在urls.py里添加路由映射:
from django.urls import path from . import views urlpatterns = [ path('view1/', views.my_view1, name='my_view1'), path('view/', views.my_view, name='my_view'), ]
方案2:Session存储传递(适合跨请求存数据的场景)
如果不想用表单传递,可以把经纬度存在session里,my_view直接从session读取:
1. 改写my_view1
def my_view1(request): latitude = 39.9042 longitude = 116.4074 # 把经纬度存入session request.session['latitude'] = latitude request.session['longitude'] = longitude # 渲染页面或重定向到需要提交POST的页面 return render(request, 'submit_page.html')
2. 修正my_view
@require_http_methods(["POST"]) def my_view(request): if request.method == "POST": # 从session获取经纬度 latitude = request.session.get('latitude') longitude = request.session.get('longitude') if not latitude or not longitude: return JsonResponse({'error': '没获取到经纬度数据'}, status=400) # 后续栅格处理逻辑和方案1一致,这里省略 # ... return JsonResponse({ 'pixel_value': pixel_value, 'raster_values': raster_values }, status=201) return JsonResponse({'error': '请求方法错误'}, status=405)
重要提醒
- 经纬度获取后一定要转成数值类型,不然栅格处理代码会报错
xr.open_rasterio已经被废弃,建议换成rioxarray.open_rasterio- 处理栅格时注意x对应经度,y对应纬度,别搞反了
JsonResponse只能接收可序列化的字典,不能直接传多个参数
内容的提问来源于stack exchange,提问作者Shaheer
相关产品推荐
相关产品推荐

