在Django中为模型字段实现html输出

时间:2014-04-19 08:22:18

标签: 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 = 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>

我的第一个想法是在管理器中实现一个函数,但似乎打破了MVC规则......有一个正确的方法吗?

2 个答案:

答案 0 :(得分:0)

您不应在视图代码中汇编html,这是模板标记的用途。把它放在例如。 <app>/templatetags/<app>tags.py(用您的应用名称替换<app>):

from django.utils.safestring import mark_safe
from django import template
register = template.Library()

@register.simple_tag
def spanme(fld):
    return mark_safe("<span>%s</span>" % fld)

并将其用作:

{% load <app>tags %}
...
{% spanme status.order %}

答案 1 :(得分:0)

也可以对模型字段进行子类化:

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)

然后你可以像这样使用它:

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>

做这样的事情会让其他人感到非常惊讶,所以请永远不要这样做: - )

ps:如果你继承的不是文本字段,你可以覆盖__unicode__(所以你不必在模板中使用.as_span),不过这是更多的工作。