Campo Readonly en el admin que muestra el html
Igor Támara
Senior Software EngineerEn esta entrada mostraremos cómo incluir html a modo readonly en el admin de Django. Los read_only fields muestran el texto plano, una alternativa no válida para los administradores que definitivamente no son técnicos. Mostraremos una forma rápida de lograr que el admin de Django cuente con un un "readonly" en html.
Introducción
En esta entrada mostraremos cómo incluir html a modo readonly en el admin de Django. Los
read_only fields muestran el texto plano, una alternativa no válida para los administradores que definitivamente no son técnicos. Mostraremos una forma rápida de lograr que el admin de Django cuente con un un "readonly" en html. La estrategia se basa en extender el campo Textarea presente en forms de Django.
El nuevo campo
Se parece en gran medida a la definición del propio
Textarea de Django, lo único que estamos haciendo es, dado que es un campo que sabemos contiene html y que tenemos un editor embebido dentro del admin como ck, tiny o redactor, tenemos oportunidad de definir nuestro propio field para formularios
from django import forms
from django.forms.util import flatatt
from django.utils.safestring import mark_safe
from django.utils.encoding import force_text
from django.utils.html import format_html
class HtmlReadonlyTextArea(forms.Textarea):
def render(self, name, value, attrs=None):
attrs['style'] = 'display:none'
final_attrs = self.build_attrs(attrs, name=name)
return format_html('u<textarea{0}>{1}</textarea><div>{2}</div>'.format(
flatatt(final_attrs),
force_text(value),
mark_safe(value)
))
Dentro del admin
Hacemos uso del no documentado y popular
formfield_for_dbfield en nuestro ModelAdmin o TabularInline, por ejemplo:
class PageApprovalAdmin(admin.ModelAdmin):
.
.
.
def formfield_for_dbfield(self, db_field, **kwargs):
if db_field.name in ('content', 'content_en'):
kwargs['widget'] = HtmlReadonlyTextArea()
return super(PageApprovalAdmin, self).formfield_for_dbfield(
db_field,
**kwargs
)
Un resultado posible luciría así:
Como nota adicional, la oportunidad de contar con el código fuente de Django, proporciona la oportunidad de contar con las mejores prácticas. Si no fuera opensource sería mucho más complejo llegar a soluciones rápidas y eficaces.
Written by Igor Támara
A seasoned developer, Igor brings expertise in designing and building complex software systems. With a focus on quality and performance, they lead projects that drive innovation and deliver reliable solutions to meet user needs.