Страница администратора Django - Экспорт полей + вызываемые поля - PullRequest
0 голосов
/ 24 января 2019

Django Версия: 1.11 Python: 2,7 Пакет: django-import-export

Я пытаюсь экспортировать "вызываемые" поля для страницы администратора Django. (Ссылка: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display)

В их примере у них есть «вызываемый» для их 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", )

Однако я получу, что у Person нет поля с именем upper_case_name. Есть ли способ экспортировать вызываемые поля?

Из документации видно, что вы можете экспортировать несуществующие поля.

https://django -import-export.readthedocs.io / ен / последний / 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 Ответ

0 голосов
/ 25 января 2019

Похоже, есть два способа сделать это:

Метод 1

От: https://django -import-export.readthedocs.io / en / latest / api_fields.html

  • - строка атрибута экземпляра или , вызываемая объектом.

Добавить вызываемую функцию в модель.

    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"
                   )

ура!

...