2016-08-01 7 views
1

私はMultipleObjectMixinFormViewの両方を継承するDjangoのクラスベースのビューを使用しています。コードはそうのようなものです:MultipleObjectMixinとFormViewの組み合わせ

class UnseenActivityView(MultipleObjectMixin, FormView): 
    form_class = UnseenActivityForm 
    template_name = "user_unseen_activity.html" 
    paginate_by = 20 

    def get_queryset(self): 
     queryset = #some queryset  
     return queryset 

    def get_context_data(self, **kwargs): 
     context = super(UnseenActivityView, self).get_context_data(**kwargs) 
     if self.request.user.is_authenticated(): 
      context["verified"] = VERIFIED_USERS #this is a list of special IDs 
     return context 

コードのこの作品は、私にu'object_list'ためkeyerrorを返します。 object_listはkwargs辞書にはありません。誰かがこの問題のトラブルシューティングを手助けできますか?私はFormViewが私のcbvに必要でしたが、ページ番号が付けられたものはMultipleObjectMixinです。


Traceback (most recent call last): 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/core/handlers/base.py", line 115, in get_response 
    response = callback(request, *callback_args, **callback_kwargs) 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/contrib/auth/decorators.py", line 25, in _wrapped_view 
    return view_func(request, *args, **kwargs) 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/views/generic/base.py", line 68, in view 
    return self.dispatch(request, *args, **kwargs) 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/views/generic/base.py", line 86, in dispatch 
    return handler(request, *args, **kwargs) 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/views/generic/edit.py", line 155, in get 
    return self.render_to_response(self.get_context_data(form=form)) 
    File "/home/hassan/Desktop/myproject/myapp/views.py", line 5494, in get_context_data 
    context = super(UnseenActivityView, self).get_context_data(**kwargs) 
    File "/home/hassan/.virtualenvs/myenv/local/lib/python2.7/site-packages/django/views/generic/list.py", line 95, in get_context_data 
    queryset = kwargs.pop('object_list') 
KeyError: u'object_list' 
+2

デバッグの手助けが必要な場合は、トレースバックを送信してください。 – Alasdair

+0

@Alasdair:トレースバックを追加しました。ソラリスモケは、私が遭遇したデッドエンドの正当な理由を与える。私はおそらく自分自身でFormviewでページ分割を実装する必要があります。あなたがその点で追加できるものがあれば、答えとして自由に感じてください。 –

+0

Djangoの非常に古いバージョンを使用しています - Django 1.6以降では 'kwargs.pop( 'object_list'、self.object_list)'を代わりに使用しています。 @ solarissmokeが引用したDjangoのドキュメントのヒントに同意します。私は、一般的な意見があまりにも多くなると予想していると思います。ビューで[Paginator](https://docs.djangoproject.com/ja/1.9/topics/pagination/)クラスを使用してみてください。 – Alasdair

答えて

2

あなたは、このアプローチの問題に実行しようとしています。

Pythonはmethod resolution orderを使用して、親クラスのどのメソッドが呼び出されるかを判断します。あなたのケースでは、super(UnseenActivityView, self).get_context_data()はとなりますが、FormView.get_context_dataではなくなります。どちらの方法でも、両方の親クラスからのコンテキストがテンプレートに渡されることはなく、何かが壊れてしまいます。

これはまた、あなたがKeyErrorなっている理由である - MultipleObjectMixin.get_context_dataobject_list kwargを期待していますが、通常はget_context_data()を呼び出すget()方法はありませんがありFormView(再びメソッド解決)、から来ているので、1を供給されていないが任意のobject_listの知識。

私はあなたがadvice in the documentationに耳を傾け、このように、これらのクラスを組み合わせることではなくのことを示唆している:

汎用ビューは制限があります。ビューを汎用ビューのサブクラスとして実装するのに苦労している場合は、独自のクラスベースまたは機能ビューを使用して、必要なコードだけを書く方が効果的です。この場合

は、私はあなたのフォームを処理するために FormViewを使用することをお勧めますが、自分自身を表示するには、リストを扱うのではなく MultipleObjectMixinプラグインしようとするためのコードを記述します。もちろん、ロジックを MultipleObjectMixinからコピーすることはできます。

+0

そうですね。私は実際にページ分割を使用したいと思っていました。これが最初に私にこれをもたらしました。 –

関連する問題