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

使用{% crispy form %}标签时Django Crispy Form未生成模型ID隐藏字段

问题原因与解决方法

核心原因

当你在forms.py中通过FormHelper自定义表单布局后,使用{% crispy form %}标签时,Crispy Forms会严格按照你定义的布局结构渲染字段——如果你的布局里没有显式添加id字段(待更新对象的主键),它就不会被自动渲染出来。

而{{ form | crispy }}过滤器的逻辑不同:它会自动渲染表单中所有字段,包括Django ModelForm默认生成的隐藏id字段,不受自定义布局的限制。

解决方法

要让{% crispy form %}渲染出隐藏的id字段,只需把它显式加到FormHelper的布局里即可:

示例代码修改

在QuestionForm的布局定义中添加id字段:

from crispy_forms.layout import Layout, Field, Hidden

class QuestionForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_tag = False
        
        # 自定义布局,显式加入id字段
        self.helper.layout = Layout(
            # 方式1:用Hidden组件直接指定
            Hidden('id', self.instance.id if self.instance else ''),
            # 方式2:用Field组件,Crispy会自动识别为隐藏字段
            # Field('id'),
            
            # 你的其他表单字段
            Field('title'),
            Field('content'),
            # ...更多字段
        )

两种方式任选其一即可,之后再用{% crispy form %}渲染时,id隐藏字段就会正常出现在HTML中,更新功能也能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:28:08