Django ModelForm添加ID字段不显示问题求助
问题原因及解决办法
1. 主键字段默认被设为隐藏组件
Django的ModelForm会自动将主键(id)字段的渲染组件设置为HiddenInput,哪怕你把id加入了fields列表,它也只会生成隐藏的输入框,不会在页面上显示出来。
解决办法:手动修改id字段的组件为只读的文本输入框,有两种方式:
方式一:在Form类中显式定义id字段
class ProductVideoForm(forms.ModelForm): # 显式定义id字段,设置为只读文本框 id = forms.CharField(widget=forms.TextInput(attrs={'readonly': 'readonly'})) class Meta: model = ProductVideo translatable_fields = get_translatable_fields(ProductVideoTranslation) fields = [ "product", "id", "type", "placeholder", ] + translatable_fields widgets = { "placeholder": ImageInput(), } trans_fields_per_lang = get_trans_fields_per_lang(translatable_fields)
方式二:在Meta的widgets中配置
class ProductVideoForm(forms.ModelForm): class Meta: model = ProductVideo translatable_fields = get_translatable_fields(ProductVideoTranslation) fields = [ "product", "id", "type", "placeholder", ] + translatable_fields widgets = { "placeholder": ImageInput(), # 给id字段设置只读文本框组件 "id": forms.TextInput(attrs={'readonly': 'readonly'}), } trans_fields_per_lang = get_trans_fields_per_lang(translatable_fields)
2. 模板未渲染表单的具体字段
你当前的模板只渲染了{{ video_formset.management_form }},这只是表单集的管理字段(用于跟踪表单数量、删除状态等),并不会渲染每个表单里的具体字段。
解决办法:在模板中遍历表单集,渲染每个表单的字段:
{{ video_formset.management_form }} {% for form in video_formset %} <!-- 渲染id字段 --> <div> <label>ID:</label> {{ form.id }} </div> <!-- 渲染其他字段 --> {{ form.product }} {{ form.type }} {{ form.placeholder }} <!-- 渲染多语言字段 --> {% for lang_fields in form.trans_fields_per_lang %} {{ lang_fields }} {% endfor %} {% endfor %}
这样修改后,id字段就会以只读的形式显示在页面上了。
内容的提问来源于stack exchange,提问作者darkblade60
相关产品推荐
相关产品推荐

