对于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
Run Code Online (Sandbox Code Playgroud)
但是我找不到规范的方法来做Archetypes,变换器不能用rawhtml,只是用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
Run Code Online (Sandbox Code Playgroud)
在Archetypes中,常规吸气器为您完成此操作.
因此,如果您调用getText某个具有文本字段的AT类型,则会返回转换后的值:检查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')
Run Code Online (Sandbox Code Playgroud)
进一步:
obj.getRawText返回实际内容,例如obj.text.raw使用RichTextValue的DX内容.
您可以检查内容是否提供IBaseObject而不是捕获AttributeError.