使用Dexterity
内容类型,规范方法是使用变换器:
from plone.app.textfield.interfaces import ITransformer
from plone.app.textfield.value import IRichTextValue
def get_text_field(obj):
"""Get text field in object on Dexterity."""
transformer = ITransformer(obj)
text = ''
if IRichTextValue.providedBy(obj.text): # Dexterity
text = transformer(obj.text, 'text/plain')
return text
但我无法找到使用Archetypes
执行此操作的规范方法,变换器无法使用raw
html,只使用RichTextValue
对象。
我现在的方法是使用lxml.html
将html转换为文本,但我不知道它是否有效:
def get_text_field(obj):
"""Get text field in object on both, Archetypes and Dexterity."""
text = ''
try:
raw = obj.getText() # Archetypes
if raw != '':
from lxml import html
el = html.fromstring(raw)
text = el.text_content()
except AttributeError:
from plone.app.textfield.value import IRichTextValue
if IRichTextValue.providedBy(obj.text): # Dexterity
from plone.app.textfield.interfaces import ITransformer
transformer = ITransformer(obj)
text = transformer(obj.text, 'text/plain')
return text
答案 0 :(得分:8)
在Archetypes中,常规的getter会为你做这件事。
因此,如果您在某个具有文本字段的AT类型上调用getText
,则会获得转换后的值:检查https://github.com/plone/Products.Archetypes/blob/e9ad0f4e76544b7890835ca93d25adeca4fc064f/Products/Archetypes/Field.py#L1564
它使用字段上指定的mimetype。
如果输出类型为text/html
且您想要text/plain
。
您可以使用mimetype参数调用字段getter:
obj.getField('text').get(obj, mimetype='text/plain')
此外:
obj.getRawText
会在具有RichTextValue的DX内容上返回实际内容,例如obj.text.raw
。
您可以检查内容是否提供IBaseObject
而非抓住AttributeError
。