2016-04-28 10 views
2

私はDjango import_exportを使用して、管理ページにCSVアップロードを実装しています。今私は外部キー列を含む1つのモデルを持っていますが、外部キー列はインポートごとに1つの値しか持たないでしょう。したがって、ユーザーが列を追加するのではなく、ドロップダウンから関連するモデルインスタンスを選択できるようにしたいと考えています。これを行うには、デフォルトのメソッドimport_actionprocess_importをオーバーライドする必要があるインポートフォームをカスタマイズする必要がありますが、これまでのところ何の効果も見せていません。私は、インポートページに行くときdjangoの管理インポートフォームをインポートするimport_export

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'を取得し、ローカルVARSに私はrequest objectは実際に私がものではないと信じているMyModelAdminクラス、であることがわかります。ここで私はこれまでにしたものですなるはずです。

答えて

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)

0
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)