Pull to refresh

Написание декоратора при использовании django-export-import

Привет, Хабр! Меня зовут Павел Цвилюк, начинающий Python Developer. В ходе работы над одним из проектов я столкнулся с проблемой подключения поискового поля и выгрузки отчётов в exel в административной панели. Их необходимо было регистрировать вместе с моим классом User:

models.py
class User(models.Model):
    name=models.CharField(max_length=200)
    surname=models.CharField(max_length=200)
    email=models.EmailField()
    password=models.CharField(max_length=200)
    telephone=models.PositiveIntegerField(max_length=12,blank=True,null=True)

Так выглядел мой код, когда я попытался изначально зарегистрировать их:

admin.py
from django.contrib import admin
from .models import User
from import_export import resources
from import_export.admin import ImportExportModelAdmin

class UsersAdmin(admin.ModelAdmin):
    search_fields = ('name', 'email', 'telephone')

class UsersResource(resources.ModelResource):
    class Meta:
        model = User
        skip_unchanged = True
        fields = ('id', 'name', 'email', 'telephone')

class UserAdmin(ImportExportModelAdmin):
        resource_class = UsersResource

admin.site.register(User, UsersAdmin, UsersAdmin)

Запустив вышеописанный код я получил следующее:
admin.site.register(User, UsersAdmin, UserAdmin)
TypeError: register() takes from 2 to 3 positional arguments but 4 were given
Я передаю 3 possitional arguments, но я не учёл, что «self» being passed implicitly. По-отдельности они работали без каких-либо проблем, так что надо было просто правильно укомплектовать это всё для передачи. Я выяснил, что ImportExportModelAdmin есть в родителях admin.ModelAdmin, как и UsersAdmin. Использование декоратора было лучшим решением для выхода из этой ситуации.

Свою строку admin.site.register(User, UsersAdmin, UsersAdmin) я заменил на следующую:

@admin.register(User)
class UserAdmin(ImportExportModelAdmin):
    search_fields = ('name', 'email', 'telephone')

И вуаля, всё заработало! Для меня это было маленькой, но очень приятной победой. Надеюсь, что моя статья поможет тем, кто столкнётся с такой же проблемой. Спасибо, что дочитали!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.