【问题标题】:Django Admin Page - Export fields + callable fieldsDjango 管理页面 - 导出字段 + 可调用字段
【发布时间】:2019-06-18 15:32:09
【问题描述】:

Django 版本:1.11 蟒蛇: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 has no field named 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()

我尝试做同样的事情,但我会收到错误 Person has no field named upper_case_name。 有什么想法吗?

提前致谢!

【问题讨论】:

    标签: django django-1.11 django-import-export


    【解决方案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",
                   )
    

    方法二

    这一切都可以在资源中完成:

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

    干杯!

    【讨论】:

      猜你喜欢
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2011-05-19
      • 2020-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多