如何使 Django 管理员只读 textarea 字段
Posted
技术标签:
【中文标题】如何使 Django 管理员只读 textarea 字段【英文标题】:How to make a Django admin readonly textarea field 【发布时间】:2016-01-28 10:22:37 【问题描述】:在 Django admin 中,如果我有一个模型字段 TextField
并使用 readonly_fields
将其设置为只读,那么它会在 <p>
标记中显示为文本。
我希望它仍然显示为 textarea
字段,但设置了 disabled
属性。
最简单的方法是什么?
【问题讨论】:
【参考方案1】:使用表单域
somefield = forms.CharField(
widget=forms.TextInput(attrs='readonly':'readonly')
)
【讨论】:
【参考方案2】:readonly_fields
可以采用方法名称和字段名称。您可以编写一个在禁用的文本区域中呈现字段值的方法。
确保从模型管理员中排除该字段,因为它将不再位于 readonly_fields
。
【讨论】:
【参考方案3】:有点晚了,但这里有一个想法(受@cinoch 的回答和this answer 启发)对我有用,而且代码最少:
不要将TextField
的名称添加到ModelAdmin
子类中的readonly_fields
(否则第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 并更详细地描述 here 或 here。
此外,如果ModelAdmin.has_change_permission()
返回False
,这将无效。
【讨论】:
【参考方案4】:@alasdair's answer其实挺聪明的,可惜没有提供例子。
这是我根据docs 对readonly_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
,这也有效。
【讨论】:
以上是关于如何使 Django 管理员只读 textarea 字段的主要内容,如果未能解决你的问题,请参考以下文章