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

如何在Django模板中为{{form.as_hidden}}赋予{{c.Name}}的值

解决Django模板中传递{{c.Name}}到隐藏表单的问题

嘿,我来帮你搞定这个问题。你现在的需求是把循环里每个{{c.Name}}的值传递给删除表单的隐藏字段,对吧?直接用{{form.as_hidden}}肯定不行,因为这个表单实例的初始值是在视图里固定的,没法跟着循环项动态变化。下面给你两种实用的解决方法:

方法一:手动添加隐藏输入字段(最简单直接)

不需要依赖表单类的as_hidden,直接在循环里写一个隐藏的<input>标签,把{{c.Name}}绑定到它的value属性上就行:

<table align="center">
    <th>Name</th>
    <th>Address</th>
    <th>City</th>
    {% for c in ads %}
    <tr>
        <td>{{c.Name}}</td>
        <td>{{c.Address}}</td>
        <td>{{c.City}}</td>
        <td>
            <form action="/" method="post">
                {% csrf_token %}
                <!-- 手动添加隐藏字段,传递当前项的Name -->
                <input type="hidden" name="ad_name" value="{{ c.Name }}">
                <input type="submit" value="Delete">
            </form>
        </td>
    </tr>
    {% endfor %}
</table>

然后在你的delete视图里,通过request.POST.get('ad_name')就能拿到这个值,接着执行删除逻辑:

def delete(request):
    if request.method == 'POST':
        # 获取传递过来的Name值
        target_name = request.POST.get('ad_name')
        # 假设你的模型是Ad,执行删除操作
        # 注意:如果Name不是唯一字段,可能会删除多个匹配项,建议用ID更安全
        from .models import Ad
        Ad.objects.filter(Name=target_name).delete()
        # 删除后可以重定向到列表页或者返回成功提示
        return redirect('ad_list')
    # 处理GET请求的情况(比如有人直接访问delete页面)
    return render(request, 'your_template.html')

方法二:使用表单类动态设置初始值(更规范的Django方式)

如果你想保持用表单类的方式,那需要先定义一个带隐藏字段的表单,然后在循环里给每个表单实例设置动态初始值:

第一步:定义表单类

在你的forms.py里创建一个包含隐藏字段的表单:

from django import forms

class DeleteAdForm(forms.Form):
    # 定义隐藏字段用来接收Ad的Name
    ad_name = forms.CharField(widget=forms.HiddenInput())

第二步:在模板里动态实例化表单

在循环中,给每个表单实例传递initial参数,把当前c.Name赋值给隐藏字段:

<table align="center">
    <th>Name</th>
    <th>Address</th>
    <th>City</th>
    {% for c in ads %}
    <tr>
        <td>{{c.Name}}</td>
        <td>{{c.Address}}</td>
        <td>{{c.City}}</td>
        <td>
            <form action="/" method="post">
                {% csrf_token %}
                <!-- 动态生成表单实例,设置初始值 -->
                {% with delete_form=DeleteAdForm(initial={'ad_name': c.Name}) %}
                    {{ delete_form.ad_name }}
                {% endwith %}
                <input type="submit" value="Delete">
            </form>
        </td>
    </tr>
    {% endfor %}
</table>

第三步:视图里处理表单提交

视图的逻辑和方法一类似,通过表单的cleaned_data或者直接从POST里取值:

from .forms import DeleteAdForm

def delete(request):
    if request.method == 'POST':
        form = DeleteAdForm(request.POST)
        if form.is_valid():
            target_name = form.cleaned_data['ad_name']
            Ad.objects.filter(Name=target_name).delete()
            return redirect('ad_list')
    return render(request, 'your_template.html')

重要提示:用ID代替Name更可靠

如果你的Name字段不是唯一的,用它来删除可能会误删多个条目。建议改用每个Ad对象的id来传递,这样更准确:

  • 模板里把隐藏字段的value改成{{c.id}}
  • 视图里用Ad.objects.filter(id=target_id).delete()来删除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:35:55