Adding django import_export to Abstract User Model

Question:

Below is my admin.py file.

I want to implement the import_export feature on the Employee model which is Abstract User Model.

from django.contrib import admin
from inventory.models import Employee
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group
from import_export.admin import ImportExportModelAdmin
admin.site.unregister(Group)

# admin.site.register(Employee)


class EmployeeAdmin(UserAdmin):
    list_display = ('emp_num', 'emp_name', 'email',
                    'emp_designation', 'is_admin', 'is_staff')
    search_fields = ('emp_num', 'emp_name')

    readonly_fields = ('last_login',)
    ordering = ('emp_num',)
    filter_horizontal = ()
    list_filter = ('is_admin',)
    fieldsets = ()


admin.site.register(Employee, EmployeeAdmin)
Asked By: NIHIR AGARWAL

||

Answers:

The ImportExportModelAdmin [readthedocs.io] is just a ModelAdmin with a ImportExportMixin [readthedocs.io], so probably the most clean solution is use the ImportExportMixin:

from django.contrib import admin
from inventory.models import Employee
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import Group
from import_export.admin import ImportExportMixin
admin.site.unregister(Group)

# admin.site.register(Employee)


class EmployeeAdmin(ImportExportMixin, UserAdmin):
    list_display = ('emp_num', 'emp_name', 'email',
                    'emp_designation', 'is_admin', 'is_staff')
    search_fields = ('emp_num', 'emp_name')

    readonly_fields = ('last_login',)
    ordering = ('emp_num',)
    filter_horizontal = ()
    list_filter = ('is_admin',)
    fieldsets = ()


admin.site.register(Employee, EmployeeAdmin)
Answered By: Willem Van Onsem

Best way to do this is to create a Proxy Model that will be using the UserAdmin (with all features of hashing passwords and so on).

Here’s how to do it:

In your models:

class MyModel(models.Model):
    << my fields >>

class MyProxyModel(MyModel):
    class Meta:
        proxy = True

In your admin.py file:

from django.contrib.auth.admin import UserAdmin
from import_export.admin import ImportExportModelAdmin

from .models import MyModel, MyProxyModel

class MyModelAdmin(ImportExportModelAdmin):
    << list_display, search fields, and all custom admin stuff >>

admin.site.register(MyModel, MyModelAdmin)
admin.site.register(MyProxyModel, UserAdmin)

Now, if you want to manage your objects with custom search fields and filters, you use the ModelAdmin, and if you want to use Built In Django features like password hashing, you use the proxy model admin.

Answered By: Kaiss B.
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.