如何在Django FormSet中展示不可编辑的pub_date字段
解决方法
方案一:在ModelForm中添加只读的pub_date字段
将pub_date字段加入表单,同时设置为不可编辑状态,既能在页面展示字段值,又能避免用户修改。
修改你的ApplicationForm代码:
class ApplicationForm(forms.ModelForm): pub_date = forms.DateTimeField( widget=forms.TextInput(attrs={'readonly': 'readonly'}), required=False ) class Meta: model = Application fields = ['name', 'pub_date'] # 包含需要编辑的字段和pub_date
这样pub_date会被纳入表单的可见字段,渲染后是只读输入框,显示对应实例的日期值;设置required=False是因为该字段不需要用户输入,避免表单验证报错。如果希望纯文本展示(无输入框样式),可以调整widget的样式,比如添加style='border:none; background:transparent;'。
方案二:模板中直接通过表单实例获取pub_date值
无需修改表单代码,直接在模板里借助表单绑定的实例对象获取pub_date值并展示,这种方式更轻量,不影响表单的验证与提交逻辑。
修改模板代码:
{% for form in formset.forms %} <tr> <!-- 以格式化后的文本展示发布日期 --> <td>{{ form.instance.pub_date|date:"Y-m-d H:i:s" }}</td> <!-- 渲染可编辑的表单字段 --> {% for field in form.visible_fields %} <td>{{ field }}</td> {% endfor %} <!-- 必须渲染表单的隐藏字段,确保表单集提交正常 --> {% for field in form.hidden_fields %} {{ field }} {% endfor %} </tr> {% endfor %}
这里form.instance就是当前表单绑定的Application实例,直接调用其pub_date属性即可拿到数据,配合date过滤器可格式化日期显示。
方案选择建议
- 方案一适合需要保持表单字段视觉一致性的场景(比如所有字段都用输入框样式,只读字段仅禁止编辑)。
- 方案二更简洁,无需改动表单逻辑,仅在模板层面实现展示需求,推荐用于纯文本展示的场景。
内容的提问来源于stack exchange,提问作者epatage
相关产品推荐
相关产品推荐

