我是另一个快速问题,我需要经常使用模型字段的特定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规则......有一个正确的方法吗?
答案 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
),不过这是更多的工作。