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() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |