gpt4 book ai didi

django - Django模板中的自定义模型字段渲染

转载 作者:行者123 更新时间:2023-12-01 05:08:45 25 4
gpt4 key购买 nike

我已延长 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 }}

然而,这似乎首先违背了创建自定义模型字段的目的(以增强 DRYness),并且最好不惜一切代价避免。

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

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

备注 这两个模型类都是其他东西的子类,所以定义一个 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, attr, *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()

关于django - Django模板中的自定义模型字段渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26569340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com