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

Django表单预填充可调整大小Textarea文本框不显示值问题

问题根源
  • Textarea和TextInput的渲染逻辑完全不同:TextInput渲染为单标签<input>,预填充值通过标签的value属性定义;但Textarea渲染为闭合标签<textarea>预填充内容</textarea>,不会读取attrs参数中传入的value配置,所以你给Textarea的attrs加value完全无效。
  • 动态字段设置初始值的方式有误:在__init__方法中事后给self.fields[xxx].initial赋值,在部分Django版本中不会被表单渲染逻辑读取,尤其是在父类初始化完成后再动态新增字段的场景下,直接给字段对象的initial属性赋值容易失效。
可直接复用的实现代码

不要在Textarea的attrs中配置value,动态创建字段时直接把预填充值作为initial参数传入字段构造函数即可:

from django import forms

class DynamicTextForm(forms.Form):
    def __init__(self, *args, **kwargs):
        # 提前取出自定义传入的动态字段配置、预填充数据参数
        columns = kwargs.pop('columns', [])
        prefill_data = kwargs.pop('prefill_data', {})
        # 必须先执行父类初始化方法
        super().__init__(*args, **kwargs)

        for col_name in columns:
            field_key = f'inserted_value_{col_name}'
            # 创建字段时直接传入initial参数,不需要额外事后赋值
            self.fields[field_key] = forms.CharField(
                label='',
                initial=prefill_data.get(col_name, ''),
                widget=forms.Textarea(attrs={
                    "rows": 1,
                    "cols": 50,
                    "style": "resize: vertical; min-height: 2rem;" # 可选:限制仅垂直调整大小,避免布局错乱
                })
            )
额外注意事项
  • 实例化表单时如果传入了data参数(即处理用户提交的POST请求场景),initial值会自动被用户提交的内容覆盖,属于Django表单的正常逻辑,不需要额外处理。
  • 如果需要在表单实例化之后强制修改某个文本域的显示值,直接修改表单实例的initial字典即可:self.initial[field_key] = 新的预填充值,不要修改字段对象的initial属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:54:24