使用{% 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
相关产品推荐
相关产品推荐

