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

Django中如何通过表单action向视图函数传递多组数据?

实现方法指引

要同时传递device.id、interface.Interface和输入框内容到send_description视图,核心是在每个接口对应的表单中添加隐藏输入字段,自动携带这两个无需用户手动输入的值,同时确保选中的设备ID能传递到模板上下文供表单使用。

步骤1:调整设备选择视图,传递选中的设备ID到模板

当用户提交设备选择表单后,视图需要从提交的选项中拆分出device.id,并将其传入模板上下文,这样后续的接口表单才能获取到这个值。

示例视图代码:

from django.shortcuts import render, redirect
from .models import Device, Interface

def interface_view(request):
    error = ""
    selected_device_id = None
    interfaces = []
    
    if request.method == 'POST':
        dv_value = request.POST.get('dv')
        if dv_value:
            # 从"ID - 设备名称"格式的选项中拆分出ID
            selected_device_id = dv_value.split(' - ')[0]
            # 根据设备ID获取对应接口
            interfaces = Interface.objects.filter(device_id=selected_device_id)
        else:
            error = "请选择一个设备"
    
    context = {
        'devicess': Device.objects.all(),
        'interfaces': interfaces,
        'error': error,
        'selected_device_id': selected_device_id  # 新增此字段供模板使用
    }
    return render(request, '你的模板文件名.html', context)

步骤2:修改模板中的接口表单,添加隐藏字段

在每个interface循环内的表单里,新增两个隐藏输入框,分别携带selected_device_id和当前接口的interface.Interface值。这样表单提交时,这两个值会和输入框的command一同发送到视图。

修改后的表单代码:

<form action="{% url 'send_description' %}" method="POST">
    {% csrf_token %}
    <!-- 隐藏字段:传递选中的设备ID -->
    {% if selected_device_id %}
    <input type="hidden" name="device_id" value="{{ selected_device_id }}">
    {% endif %}
    <!-- 隐藏字段:传递当前接口名称 -->
    <input type="hidden" name="interface_name" value="{{ interface.Interface }}">
    <!-- 原有的输入框 -->
    <input type="text" name="command" class="form-control" placeholder="Change description">
    <br>
    <button type="submit" class="btn btn-primary align-content-lg-center">Send change</button>
</form>

步骤3:在send_description视图中接收并处理数据

现在可以通过request.POST获取到三个传递过来的值,进而执行你的业务逻辑:

def send_description(request):
    if request.method == 'POST':
        device_id = request.POST.get('device_id')
        interface_name = request.POST.get('interface_name')
        command = request.POST.get('command')
        
        # 示例逻辑:更新接口描述
        try:
            interface = Interface.objects.get(device_id=device_id, Interface=interface_name)
            interface.Description = command
            interface.save()
        except Interface.DoesNotExist:
            # 处理接口不存在的情况
            pass
        
        # 重定向回接口页面
        return redirect('interface')
    # GET请求直接重定向
    return redirect('interface')

额外提示

  • 隐藏字段的作用是自动携带无需用户交互的数据,不会在页面中显示,但会随表单提交。
  • 可以在模板中增加判断:如果selected_device_id为空(用户未选设备),则隐藏"Send change"按钮或提示用户先选择设备,避免无效提交。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:05:20