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

如何从Django模板表单获取Pending_Swap模型实例而非字符串?

解决Django模板传递模型实例失败的问题

问题场景

开发轮班交换功能时,前端模板pending_swaps.html循环渲染Pending_Swap模型对象列表swappie_pending_list,每个列表项对应一个表单。尝试用隐藏输入框传递{{ pending }}时,后端仅收到模型的__str__返回字符串,无法获取到模型实例。

问题原因

在Django模板中直接输出模型对象({{ pending }})时,会自动调用模型的__str__方法,输出的是字符串形式,而非模型实例本身。前端表单只能传递字符串类型的数据,无法直接传递Python对象。

解决方案

传递模型的主键ID(每个模型实例的唯一标识),后端通过ID查询获取对应的模型实例。

1. 修改前端模板

将隐藏输入框的value改为模型的主键{{ pending.id }}:

# pending_swaps.html
{% for pending in swappie_pending_list %}
    <form action="{% url 'ShiftSwap:pending_swaps' %}" method="post">
        {% csrf_token %}
            <p>{{ pending.swapper.name }} wants to switch your {{ pending.get_swappie_day_display }} for their {{ pending.get_swapper_day_display }}
                <input type="hidden" name="swap_id" value="{{ pending.id }}">
                <input type="submit" name="Confirm" value="Confirm">
                <input type="submit" name="Deny" value="Deny">
            </p>
    </form>
{% endfor %}

2. 后端视图处理

在接收请求的视图中,通过接收到的swap_id查询对应的Pending_Swap实例:

from django.shortcuts import get_object_or_404
from .models import Pending_Swap

def pending_swaps(request):
    if request.method == 'POST':
        swap_id = request.POST.get('swap_id')
        # 获取对应的模型实例,若不存在返回404
        pending_swap = get_object_or_404(Pending_Swap, id=swap_id)
        
        # 根据提交的按钮执行对应操作
        if 'Confirm' in request.POST:
            # 处理确认逻辑,比如修改confirm字段
            pending_swap.confirm = True
            pending_swap.save()
            # 其他后续操作...
        elif 'Deny' in request.POST:
            # 处理拒绝逻辑,比如删除该请求
            pending_swap.delete()
            # 其他后续操作...
    # 其他视图逻辑...

补充说明

  • 主键ID是Django模型默认生成的唯一标识字段(id),确保每个实例唯一,不会出现混淆。
  • 使用get_object_or_404可以避免因无效ID导致的DoesNotExist异常,提升代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:05:23