Campo Readonly en el admin que muestra el html

IT Igor Támara Igor Támara

Igor Támara

Senior Software Engineer
1 min read.

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.

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

IT Igor Támara 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.

Newsletter

Subscribe to our newsletter:

Read more

Email Responsive

Como ya sabemos, un Email no posee un CSS externo, los Emails trabajan con estilos inline ( directamente estilos al código ...

1 min read.

Build Once. Own Forever.