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