2014-03-03 40 views
4

當我改變文本例如在具有setText()的文檔中,文檔的內容類型更改爲text/plain爲什麼setText()更改文檔的contentType?

In [1]: app.Plone.invokeFactory('Document', 'doc') 
Out[1]: 'doc' 

In [2]: app.Plone.doc.getContentType() 
Out[2]: 'text/html' 

In [3]: app.Plone.doc.setText('xyz'); app.Plone.doc.getContentType() 
Out[3]: 'text/plain' 

In [4]: app.Plone.doc.setText('<abc>xyz</abc>'); app.Plone.doc.getContentType() 
Out[4]: 'text/html' 

即使我創建了一個文件,我設置mimetype明確地text/plain它改變類型text/html

In [1]: app.Plone.invokeFactory('Document', 'doc', 
           text='<abc>xyz</abc>', 
           mimetype='text/plain') 
Out[1]: 'doc' 

In [2]: app.Plone.doc.getContentType() 
Out[2]: 'text/html' 

的文本由TextField(FileField)類的_process_input()處理並猜測它的類型和它的變化。

API是否期望程序員知道_process_input()的所有猜測?如果是的話,這是否記錄在某處?

回答

2

我想你的doument是一個ATContentTypes文檔。

在這種情況下

,則使用默認的MIME類型,除非特定的MIME類型在的setText給出:

doc.setText(u"<p>your text</p>", mimetype='text/html')

看到https://github.com/plone/Products.ATContentTypes/blob/2.2.0/Products/ATContentTypes/content/document.py#L112

爲上傳文件時,MIME類型被猜到 https://github.com/plone/Products.ATContentTypes/blob/2.2.0/Products/ATContentTypes/content/document.py#L137

+1

似乎沒有「默認」mimetype,但是mimetype是由字段的_process_input來猜測的。看到我的第二個例子,即使它在'invokeFactory'中給出,內容類型也被改變了。另請參閱我的第一個示例,其中內容類型被猜測和更改。這意味着程序員必須知道**如何猜測這些猜測以及他們做出了哪些改變! – wolfrevo

+1

猜測似乎發生在https://github.com/plone/Products.ATContentTypes/blob/2.2.0/Products/ATContentTypes/content/document.py#L137不在文本字段中。在那裏設置一個跟蹤點並調試發生了什麼。 – fRiSi

+2

'guessMimetypeOfText()'僅由'manage_afterAdd()'調用,因此它解釋了在創建和調用'manage_afterAdd()'後的猜測,但'guessMimetypeOfText()'在使用'invokeFactory()'時不會被調用。實際上它是'setText()'(一個'FileField's方法),如果沒有'mimetype'調用,調用'_process_input()' - >'mimetipes.guess_content_type()' - >'mimetipes.guess_type'等並添加'mimetype'回到了kwargs。 – wolfrevo

相關問題