Страница администратора Django - Экспорт полей + вызываемые поля
Django версия: 1.11
Python: 2.7 Пакет: django-import-export
Я пытаюсь экспортировать "вызываемые" поля для страницы администратора Django. (Ссылка: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/)
В их примере у них есть "вызываемый" для их PersonAdmin list_display
,
def upper_case_name(obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Name'
class PersonAdmin(ExportMixin, admin.ModelAdmin):
list_display = (upper_case_name,)
Для Ресурса я думал, что смогу также экспортировать вызываемое поле.
class PersonResource(resources.ModelResource):
class Meta:
model = Person
fields = ( "first_name",
"last_name",
"upper_case_name", )
Тем не менее, я получу Человек не имеет поля с именем upper_case_name
, Есть ли способ экспортировать вызываемые поля?
Из документации видно, что вы можете экспортировать несуществующие поля.
https://django-import-export.readthedocs.io/en/latest/getting_started.html
Их пример был:
from import_export.fields import Field
class BookResource(resources.ModelResource):
full_title = Field()
class Meta:
model = Book
def dehydrate_full_title(self, book):
return '%s by %s' % (book.name, book.author.name)
Я повторил это и попытался:
class PersonResource(resources.ModelResource):
upper_case_name = Field()
class Meta:
model = Person
def dehydrate_upper_case_name(self, obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
Я попытался сделать то же самое, но получил бы ошибку. У лица нет поля с именем upper_case_name
, Какие-нибудь мысли?
Заранее спасибо!
1 ответ
Похоже, есть два способа сделать это:
Способ 1
От: https://django-import-export.readthedocs.io/en/latest/api_fields.html
- attribute - строка атрибута экземпляра или вызываемого объекта.
Добавьте вызываемую функцию в модель.
class Person(models.Model):
def get_upper_case_name(self):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name = property(get_upper_case_name)
Теперь в файле PersonResource объявите новое настраиваемое поле.
class PersonResource(resources.ModelResource):
upper_case_name = Field(attribute="get_upper_case_name", column_name="Upper Case Name")
class Meta:
model = Person
fields = ( "first_name",
"last_name",
)
Способ 2
Все это можно сделать в Ресурсе:
class PersonResource(resources.ModelResource):
upper_case_name = fields.Field(column_name="Upper Case Name")
def dehydrate_upper_case_name(self, obj):
return ("%s %s" % (obj.first_name, obj.last_name)).upper()
class Meta:
model = Person
fields = ( "first_name",
"last_name",
"upper_case_name"
)
Ура!