Python 在Django中实现模型字段的html输出
我还有一个快速的问题,我需要经常为模型字段使用特定的html表示。我知道有很多表单文档,但是简单模型字段呢?例如: models.pyPython 在Django中实现模型字段的html输出,python,django,Python,Django,我还有一个快速的问题,我需要经常为模型字段使用特定的html表示。我知道有很多表单文档,但是简单模型字段呢?例如: models.py class Status (models.Model): order = models.PositiveIntegerField(_(u'Order')) name = models.CharField(_(u'Name'), max_length=255, unique=True, db_index=True) color = mode
class Status (models.Model):
order = models.PositiveIntegerField(_(u'Order'))
name = models.CharField(_(u'Name'), max_length=255, unique=True, db_index=True)
color = models.CharField(_(u'Color'), max_length=6, null=True, blank=True)
template.html
{{status.order.as_span}} will be equivalent to <span>{{status.order}}<span>
{{status.order.as{u span}}将等同于{{status.order}
我的第一个想法是在管理器中实现一个功能,但似乎打破了MVC规则。。。有合适的方法吗?您不应该在视图代码中组装html,这就是模板标记的用途。将其放入例如
/templatetags/tags.py
(将
替换为您的应用程序名称):
来自django.utils.safestring导入标记\u safe
从django导入模板
register=template.Library()
@register.simple_标记
def spanme(fld):
返回安全标记(“%s”%fld)
并将其用作:
{% load <app>tags %}
...
{% spanme status.order %}
{%load tags%}
...
{%spanme status.order%}
也可以对模型字段进行子类化:
from django.utils.safestring import mark_safe
from django.db.models.fields import CharField
from django.db import models
class SpanValue(unicode):
def as_span(self):
return mark_safe(u"<span>%s</span>" % self)
class SpanField(CharField):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if value is None:
return None
return SpanValue(value)
class SpanModel(models.Model):
foo = SpanField(max_length=25)
哪个会打印
<span>bar</span>
条
做这样的事情会让其他人感到非常惊讶,所以请永远不要这样做:-)
ps:如果您继承的内容不是文本字段,那么您可能可以重写
\uuuuunicode\uuuuu
(这样您就不必在模板中使用.as.\u span
),但是这是相当多的工作 对于这样一个简单的用例来说,这太复杂了。绝对不是。正如OP所说,“我的每一个模型中的每一个积极的Integerfield”都需要这个,这似乎是唯一明智的解决方案。(1) 它将表示逻辑排除在模型之外,(2)它将此功能收集在一个地方,(3)它非常简单,假设您有其他模板标记和过滤器,它几乎非常简单。抱歉,耽搁了,我有点忙。。看起来很好用!干杯
from django import template
from maint.models import *
#val = SpanModel.objects.create(foo='bar')
val = SpanModel.objects.get(foo='bar') # must get it from the db for `to_python` to run
t = template.Template(u"""{{ val.foo.as_span }}""")
print t.render(template.Context({'val': val}))
<span>bar</span>