Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中实现模型字段的html输出_Python_Django - Fatal编程技术网

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

Python 在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

我还有一个快速的问题,我需要经常为模型字段使用特定的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>
{{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>