【问题标题】:Extending the admin import form for django import_export扩展 django import_export 的管理员导入表单
【发布时间】:2016-04-28 14:45:13
【问题描述】:

我正在使用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 类,我认为这不是它应该是的。

【问题讨论】:

    标签: django-admin django-import-export


    【解决方案1】:

    避免重新实现import_action()process_import();部分是因为它们是相当复杂和脆弱的方法,但更重要的是因为使用 Import/Export API 中现有的钩子有更简洁的方法。 See this answer for more details.

    【讨论】:

      【解决方案2】:

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

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

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

      或者对于较旧的python:

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

      【讨论】:

        【解决方案3】:
            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)
        

        【讨论】:

          猜你喜欢
          • 2022-11-26
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 1970-01-01
          • 2016-10-10
          • 2011-04-16
          • 1970-01-01
          • 2012-07-10
          相关资源
          最近更新 更多