I'm using Django import_export to implement CSV upload in my admin pages. Now I have one model, that contains a foreign key column, but the foreign key column will have only one value for each import. Therefore I would like to allow the user to choose the related model instance from a drop-down instead of forcing the user to append the columns themselves. In order to do this I need to customize the import form, which requires overriding the default methods import_action
and process_import
, but my efforts so far have shown no effect. Here is what I have so far:
from django import forms
from import_export.forms import ImportForm
from .models import MyModel, RelatedModel
class CustomImportForm(ImportForm):
"""Add a model choice field for a given model to the standard form."""
appended_instance = forms.ModelChoiceField(queryset=None)
def __init__(self, choice_model, import_formats, *args, **kwargs):
super(CustomImportForm, self).__init__(import_formats, *args, **kwargs)
self.fields['appended_instance'].queryset = choice_model.objects.all()
@admin.register(MyModel)
class MyModelAdmin(ImportExportModelAdmin):
resource_class = SomeResource
def import_action(self, request, *args, **kwargs):
super().import_action(self, request, *args, **kwargs)
form = CustomImportForm(RelatedModel,
import_formats,
request.POST or None,
request.FILES or None)
Now when I go the import page I get the AttributeError MyModelAdmin has no attribute 'POST'
and in the local vars I can see that the request object
is actually the MyModelAdmin
class, which is I believe is not what it's supposed to be.
Avoid reimplementing either import_action()
or process_import()
; partially because they're fairly complex and fragile methods, but more importantly because there are neater ways of doing this using the existing hooks in the Import/Export API. See this answer for more details.
I know, this is an old post, but I ran into this, when looking on how to override the import_action.
Your error is here:
super().import_action(self, request, *args, **kwargs)
You should call it without the self:
super().import_action(request, *args, **kwargs)
or for older python:
super(MyModelAdmin, self).import_action(request, *args, **kwargs)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With