扩展django import_export的管理员导入表单

时间:2016-04-28 14:45:14

标签: django-admin django-import-export

我正在使用Django import_export在我的管理页面中实施CSV上传。现在我有一个包含外键列的模型,但是外键列每个导入只有一个值。因此,我想允许用户从下拉列表中选择相关的模型实例,而不是强制用户自己附加列。为了做到这一点,我需要自定义导入表单,这需要覆盖默认方法import_actionprocess_import,但到目前为止我的努力没有显示效果。以下是我到目前为止的情况:

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)

现在当我进入导入页面时,我得到了AttributeError MyModelAdmin has no attribute 'POST',在本地变量中我可以看到request object实际上是MyModelAdmin类,我相信这不是什么它应该是。

3 个答案:

答案 0 :(得分:1)

我知道,这是一篇旧帖子,但在查看如何覆盖import_action时遇到了这个问题。 你的错误在这里: super().import_action(self, request, *args, **kwargs)

你应该在没有自己的情况下调用它:

super().import_action(request, *args, **kwargs)

或更老的python:

super(MyModelAdmin, self).import_action(request, *args, **kwargs)

答案 1 :(得分:1)

    def import_action(self, request, *args, **kwargs):
       response = super(MyModelAdmin, self).import_action(request, *args, **kwargs)
       context = response.context_data
       import_formats = self.get_import_formats()
       context['form'] = CustomImportForm(RelatedModel, import_formats, request.POST or None, request.FILES or None)
       return TemplateResponse(request, [self.import_template_name], context)

答案 2 :(得分:1)

避免重新实现import_action()process_import();部分原因是它们是相当复杂且脆弱的方法,而更重要的是因为有一些更巧妙的方法可以使用Import / Export API中的现有挂钩进行此操作。 See this answer for more details.