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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 16:02:40