2016-01-28 37 views
1

這是在截獲的表單實例的上下文中。我需要得到字段列表,我可以。但是我無法僅獲取圖像字段。 這裏是我使用的代碼:Django過濾只能獲得某種類型字段的字段列表

list_of_image_fields = [x.name for x in instance._meta.fields if type(x) == 'django.db.models.fields.files.ImageFieldFile'] 

x.name正確地體現了各個領域的每一個名字形成meta.fields實例。 用if語句,我希望只獲取ImageField類型。 「式(X)」當我把它改爲x.name的返回此:

<class 'django.db.models.fields.files.ImageFieldFile'> #for each field 

不過,這並不在我把它放在與空列表結束if語句的方式工作。 可以附加圖像我在調試器instance._meta.fields.03得到(這是場數03)enter image description here

回答

-2

如果你做type(x),它會給你一個類型對象而不是字符串。使用功能get_internal_type

list_of_image_fields = [x.name for x in instance._meta.fields if x.get_internal_type() == 'ImageFieldFile'] 

Django的doc about get_internal_type

+0

嗯,他們被認爲是FieldFile,注意ImageFieldFile ....我可以做到這一點,但無論如何得到區別? –

+0

這是'get_internal_type'所不可能的,因爲'ImageFieldFile'繼承自'FieldFile',但沒有覆蓋函數'get_internal_type'。檢查它會使它更清楚的源代碼:https://docs.djangoproject.com/en/1.9/_modules/django/db/models/fields/files/。 「也許」做'x____ class __.__ name__'可能會顯示你正確的名字嗎? –

4

的類型不是一個字符串,它的實際類型中看到的。所以比較一下!

from django.db.models.fields.files import ImageFieldFile 

list_of_image_fields = [x.name for x in instance._meta.fields if type(x) == ImageFieldFile] 

你在調試器中看到的實際上是str(type(ImageFieldFile))其結果是你得到什麼,當你轉換你的類型爲字符串,所以人類可以閱讀。

相關問題