Search code examples
pythondjangodjango-viewsdjango-import-export

Not passing **kwargs to django-import-export resources from custom view/form


When I use this resources.py inside Django admin everything works fine. However, when I do it on my custom view page there is an issue that popped with the **kwargs user auto-populate.

The error must be in my view as it's not passing the **kwargs but I'm not sure how to solve it. Where should I be passing this information?

KeyError at /import/
'user'

C:\Users\winkl\tj3\venv\lib\site-packages\import_export\resources.py in import_row
            self.after_import_instance(instance, new, **kwargs) …

C:\Users\winkl\tj3\portfolios\resources.py in after_import_instance
        instance.created_by = kwargs['user'] 

resources.py

class EntryResource(resources.ModelResource):

    symbol = fields.Field(
    attribute="symbol",
    column_name="symbol",
    widget=SymbolWidget(Symbol, 'name'),
    )

    date = fields.Field(
    attribute="date",
    column_name="date",
    widget=widgets.DateTimeWidget(format="%Y-%m-%d %H:%M:%S"),
    )

    class Meta:
        model = Entry
        fields = ('symbol', 'date', 'id', 'amount', 'price', 'fee', 'entry_type', 'reg_fee',)
        import_order = fields
        skip_unchanged = False
        report_skipped = True

    def after_import_instance(self, instance, new, row_number=None, **kwargs):
        print(f' Kwargs: {kwargs}')
        instance.created_by = kwargs['user']

    def after_save_instance(self, instance, using_transactions, dry_run):
        pass

view.py

@login_required
def import_data(request):
    if request.method == 'POST':
        trade_resource = EntryResource()
        dataset = Dataset()
        new_trades = request.FILES['importData']

        imported_data = dataset.load(new_trades.read().decode('utf-8'),format='csv')
        result = trade_resource.import_data(dataset, dry_run=True, raise_errors=True)

        if result.has_errors():
            messages.error(request, 'Uh oh! Something went wrong...')

        else:
            # Import now
            trade_resource.import_data(dataset, dry_run=False)
            messages.success(request, 'Your words were successfully imported')

    return render(request, 'dashboard/import.html')

Solution

  • Obviously you are getting the error because there is no entry with key 'user' in the kwargs dict.

    If you look at the source, you can see that the kwargs get passed down the call stack into after_import_instance().

    In your case, at no point is there ever a user entry in the kwargs dict.

    However, if you pass this value in to the import_data() call then it can be retrieved and used:

     your_user = load_user() # implement this as required
     result = trade_resource.import_data(dataset, dry_run=True, raise_errors=True, user=your_user)