【问题标题】:How to make a Django admin readonly textarea field如何使 Django 管理员只读 textarea 字段
【发布时间】:2016-01-28 10:22:37
【问题描述】:

在 Django admin 中,如果我有一个模型字段 TextField 并使用 readonly_fields 将其设置为只读,那么它会在 <p> 标记中显示为文本。

我希望它仍然显示为 textarea 字段,但设置了 disabled 属性。

最简单的方法是什么?

【问题讨论】:

    标签: django django-admin


    【解决方案1】:

    使用表单域

       somefield = forms.CharField(
           widget=forms.TextInput(attrs={'readonly':'readonly'})
        )
    

    【讨论】:

      【解决方案2】:

      readonly_fields 可以采用方法名称和字段名称。您可以编写一个在禁用的文本区域中呈现字段值的方法。

      确保从模型管理员中排除该字段,因为它将不再位于 readonly_fields

      【讨论】:

        【解决方案3】:

        有点晚了,但这里有一个想法(受@cinoch 的回答和this answer 启发)对我有用,而且代码最少:

        1. 不要TextField 的名称添加到ModelAdmin 子类中的readonly_fields(否则第2 步无效)

        2. 相反,将以下内容添加到您的 ModelAdmin 子类中:

          formfield_overrides = {
              TextField: dict(widget=Textarea(attrs=dict(readonly=True)))
          }
          

        请注意,这需要一些导入:

        from django.db.models import TextField
        from django.forms import Textarea
        

        TextField 现在将在管理页面上显示为可滚动的Textarea 而不是纯文本,并且其内容现在将根据需要为只读。

        缺点是这适用于模型中的所有TextFields。如果这是个问题,您可能应该使用自定义表单 as suggested by @cinoch 并更详细地描述 herehere

        此外,如果ModelAdmin.has_change_permission() 返回False,这将无效。

        【讨论】:

          【解决方案4】:

          @alasdair's answer其实挺聪明的,可惜没有提供例子。

          这是我根据docsreadonly_fields 的澄清尝试。

          假设这样的模型:

          class MyModel(models.Model):
              my_textfield = models.TextField()
          

          管理员可能看起来像这样,使用format_html 创建一个只读文本区域:

          class MyModelAdmin(admin.ModelAdmin):
              exclude = ['my_textfield']
              readonly_fields = ['display_my_textfield']
              
              @admin.display(description='my textfield')
              def display_my_textfield(self, obj):
                  return format_html(
                      '<textarea cols="40" rows="10" readonly>{}</textarea>',
                      obj.my_textfield)
          
          

          如果ModelAdmin.has_change_permission() 返回False,这也有效。

          【讨论】:

            猜你喜欢
            • 2023-04-08
            • 1970-01-01
            • 1970-01-01
            • 2018-09-05
            • 1970-01-01
            • 2012-09-19
            • 1970-01-01
            • 2011-12-24
            • 2018-09-08
            相关资源
            最近更新 更多