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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:01:06