扩展 django 的管理导入表单 import_export
Extending the admin import form for django import_export
我正在使用 Django import_export 在我的管理页面中实现 CSV 上传。现在我有一个模型,它包含一个外键列,但外键列对于每次导入只有一个值。因此,我想允许用户从下拉列表中选择相关的模型实例,而不是强迫用户自己附加列。为此,我需要自定义导入表单,这需要覆盖默认方法 import_action
和 process_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
class,它我相信这不是它应该是的样子。
我知道,这是一个旧的 post,但我 运行 进入这个,在研究如何覆盖 import_action 时。
你的错误在这里:
super().import_action(self, request, *args, **kwargs)
你应该在没有自我的情况下调用它:
super().import_action(request, *args, **kwargs)
或年龄较大的python:
super(MyModelAdmin, self).import_action(request, *args, **kwargs)
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)
避免重新实现 import_action()
或 process_import()
;部分是因为它们是相当复杂和脆弱的方法,但更重要的是因为使用 Import/Export API 中的现有挂钩有更简洁的方法来完成此操作。 See this answer for more details.
我正在使用 Django import_export 在我的管理页面中实现 CSV 上传。现在我有一个模型,它包含一个外键列,但外键列对于每次导入只有一个值。因此,我想允许用户从下拉列表中选择相关的模型实例,而不是强迫用户自己附加列。为此,我需要自定义导入表单,这需要覆盖默认方法 import_action
和 process_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
class,它我相信这不是它应该是的样子。
我知道,这是一个旧的 post,但我 运行 进入这个,在研究如何覆盖 import_action 时。
你的错误在这里:
super().import_action(self, request, *args, **kwargs)
你应该在没有自我的情况下调用它:
super().import_action(request, *args, **kwargs)
或年龄较大的python:
super(MyModelAdmin, self).import_action(request, *args, **kwargs)
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)
避免重新实现 import_action()
或 process_import()
;部分是因为它们是相当复杂和脆弱的方法,但更重要的是因为使用 Import/Export API 中的现有挂钩有更简洁的方法来完成此操作。 See this answer for more details.