设为首页收藏本站

安徽论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 10633|回复: 0

Django admin实现TextField字段changelist页面换行、空格正常显示

[复制链接]

90

主题

865

回帖

1576

积分

金牌会员

Rank: 6Rank: 6

积分
1576
发表于 2022-3-26 11:02:41 | 显示全部楼层 |阅读模式
网站内容均来自网络,本站只提供信息平台,如有侵权请联系删除,谢谢!
目录


问题背景

在Django后台的使用admin view绑定model后,可以很方便的通过网页对底层的数据表进行增删查改操作。
在实际工作中有一些数据字段会存储了json或者其他包含换行符、空格符的文本内容,这些文本内容在记录编辑详情页是能正常显示换行、空格的,如下:

但是在changelist页面则会省略所有空格、换行,导致可读性较差,如下:


原因

究其原因,其实是因为在编辑详情页面,存放文本的标签是textarea,在该标签中的文本内容并不会忽略换行、空格字符,通过使用浏览器开发者工具可以看到如下代码:
  1. <textarea name="lang_content" cols="40" rows="10" class="vLargeTextField" required="" id="id_lang_content">{
  2.   "en": "this is a content",
  3.   "zh-hant": "這是默認正文內容"
  4. }</textarea>
复制代码
而在changelist页面,默认使用的是直接就是td标签,即直接放入一个表单元格之中,这时根据HTML标准会将所有连续的空格、换行符均处理为单个空格:
  1. <td class="field-lang_content">{
  2.   "en": "this is a content",
  3.   "zh-hant": "這是默認正文內容"
  4. }</td>
复制代码
解决方案

以一个简单的test_record table的admin view为例。
表结构:
  1. CREATE TABLE `test_table` (
  2.   `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  3.   `title` varchar(255) NOT NULL DEFAULT '0',
  4.   `content` varchar(255) NOT NULL,
  5.   `lang_content` text NOT NULL,
  6.   PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
复制代码
models.py:
  1. # coding=utf-8
  2. from django.db import models


  3. class TestRecord(models.Model):
  4.     class Meta:
  5.         db_table = "test_record"
  6.         db_tablespace = 'test_db'

  7.     id = models.AutoField(primary_key=True, verbose_name="id")
  8.     title = models.CharField(max_length=255)
  9.     content = models.CharField(max_length=255)
  10.     lang_content = models.TextField()
复制代码
admin.py
  1. from django.contrib import admin
  2. from django.utils.html import format_html

  3. from .models import TestRecord


  4. @admin.register(TestRecord)
  5. class TestRecordAdmin(admin.ModelAdmin):
  6.     list_display = ('id', 'title', 'content', 'lang_content', 'lang_content_view')
复制代码
使用list_editable

将lang_content放入list_editable,如下:
  1. list_editable = ('lang_content', )
复制代码
这样在changelist页面,将使用textarea标签修饰lang_content内容,于是空格、换行符就能够正确显示:

同时在changelist页面将可以直接编辑lang_content字段,无法满足只希望该字段在changelist页面可读,而不可编辑的需求,相当于是把编辑功能和显示功能强制绑定无法分离,缺乏灵活性。

使用format_html--满足只读需求

在django.utils.html中提供了一个format_html函数,该函数可用于将所有输出内容按HTML格式转义渲染。
于是可以通过在admin class中定义一个专门负责展示lang_content内容的实例方法,将lang_content内容用pre或textarea标签包裹,而后经过format_html转义后返回。此方法更加灵活,还可通过调整标签各属性定制输出效果--比如设置高度(rows)、宽度(cols)等。
代码如下所示
  1.     def lang_content_view(self, obj):
  2.         # return format_html('<textarea cols=40 rows={} readonly>{}</textarea>', obj.lang_content.count('\n')+1, obj.lang_content)
  3.         return format_html('<pre>{}</pre>', obj.lang_content)
复制代码
显示效果如下:

对应网页代码如下:
  1. <td class="field-lang_content_view"><pre>{
  2.   "en": "this is a content",
  3.   "zh-hant": "這是默認正文內容"
  4. }</pre></td>
复制代码
到此这篇关于Django admin实现TextField字段changelist页面换行、空格正常显示的文章就介绍到这了,更多相关Django changelist 正常显示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
                                                        
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
免责声明
1. 本论坛所提供的信息均来自网络,本网站只提供平台服务,所有账号发表的言论与本网站无关。
2. 其他单位或个人在使用、转载或引用本文时,必须事先获得该帖子作者和本人的同意。
3. 本帖部分内容转载自其他媒体,但并不代表本人赞同其观点和对其真实性负责。
4. 如有侵权,请立即联系,本网站将及时删除相关内容。
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表