加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django模板中的自定义模型字段呈现

发布时间:2020-12-20 13:45:21 所属栏目:Python 来源:网络整理
导读:我用自定义模型字段扩展了 django-markdown,允许用户定义类: from django.db import modelsfrom django_markdown.fields import MarkdownFieldclass MyModel(models.Model): text = MarkdownField()class MySecondModel(models.Model): description = Markd
我用自定义模型字段扩展了 django-markdown,允许用户定义类:

from django.db import models
from django_markdown.fields import MarkdownField

class MyModel(models.Model):
    text = MarkdownField()

class MySecondModel(models.Model):
    description = MarkdownField()

现在,在模板中渲染这些字段时,可以执行以下操作:

{% load markdown_tags %}
{{ model.text|markdown }} {{ model2.description|markdown }}

然而,这似乎首先打败了创建自定义模型字段的目的(以增强干燥度),并且优选地不惜一切代价避免.

那么,有没有办法只需{{model.text}} {{model2.description}}而无需加载模板标签,也无需通过某种方式在自定义字段上定义渲染方法进行过滤?

类似的问题已经被提出:Is there a way to customize how the value for a custom Model Field is displayed in a template?,但答案需要在模型中添加一个方法.这意味着向MyModel和MySecondModel以及任何后续的方法添加方法.再次,这击败了干的整个对象!

NB两个模型类都是其他类的子类,因此定义一个mixin是可行的,但肯定有一个更好的方法!

解决方法

我和你的情况一样.我想我可以使用mixin来解决它到Model类.

它似乎按预期工作,但我不确定这是否是正确的方法.感觉像脏兮兮的黑客,我不完全明白.

你当然应该用更有用的东西替换方法_shout().

from django.utils.safestring import mark_safe
from django.db import models


class LoudModelMixin(object):

    """ adds the 'html' property to a Model
    Lets regular django models be louder!

    Regular field:
    >>> blogpost.title
    'hello world'

    Same field,but louder.
    >>> blogpost.html.title
    '<strong>HELLO WORLD!</strong>'
    """

    @property
    def html(self):
        return self._HTML(self)

    class _HTML(object):

        def __init__(self,parent):
            self.parent = parent

        def __getattr__(self,attr,*args):
            raw_text = getattr(self.parent,*args)
            assert isinstance(raw_text,str),'only words can be loud.'
            return mark_safe(self._shout(raw_text))

        def _shout(self,raw,tag='strong'):
            """ Do something useful with the text here. """
            return '<{tag}>{text}!</{tag}>'.format(
                tag=tag,text=raw.upper()
            )


class Blogpost(models.Model,LoudModelMixin):
    title = models.CharField(max_length=50)
    body = models.TextField()

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读