5

そこで、ジェネリック クラス ベースのビューを使い始めましたが、時間を節約できると言わざるを得ません。しかし、各ビューでコーディングするのではなく、ミックスインを使用して一般的な impl を提供できるかどうか疑問に思っていました。たとえば、 と がListViewありDetailViewます。get_queryset()リストと編集を制限するために、ログインしているユーザーでオーバーライドしてフィルター処理できます。しかし、ご想像のとおり、各ビューでそれを行う必要があります。

class JediListView(ListView):
    def get_queryset(self):
        q = <call super>.filter(user=request.user) #assume i have 'login_required' in the urls

class JediDetailView(DetailView):
    def get_queryset(self):
        q = <call super>.filter(user=request.user) #assume i have 'login_required' in the urls

ビューごとに新しい親クラスを作成できますが、それでもコードを繰り返すことになります。

class RepublicListView(ListView):
     # override get_queryset code as above

class JediListView(RepublicListView):

# repeat fot DetailView, DeleteView, UpdateView

私はミックスインについて疑問に思っていました.ミックスインがどのように機能するかを正確に確信しています[Javaのバックグラウンドから、同時に畏敬の念と恐れを抱いています]

4

2 に答える 2

9

実際、あなたはほとんど自分で答えを見つけました。次の Mixin を記述できます。

class UserFilterMixin:
    def get_queryset(self):
        return <call super>.filter(user=self.request.user)

そして、次のようにクラスで使用します。

class RepublicListView(LoginRequiredMixin, UserFilterMixin, ListView):

他のクラスについても同様です...

于 2013-03-21T12:30:01.583 に答える
2

django-bracesLoginRequiredMixinから使用できます。

from django.views.generic import ListView, DetailView

from braces.views import LoginRequiredMixin


class JediListView(LoginRequiredMixin, ListView):
    model = JediModel


class JediDetailView(LoginRequiredMixin, Detail):
    model = JediModel

Chapter-8: Best Practices for Class-Based ViewsDJANGOのTWO SCOOPS によると、

サードパーティのパッケージ: CBV と django-braces の組み合わせは素晴らしい django-braces は、Django CBV に欠けているコンポーネントであると感じています。Django CBV の実装をはるかに簡単かつ高速にする、明確にコード化された mixin のセットを提供します。次のいくつかの章では、さまざまなコード例でミックスインを示します。

于 2013-01-22T05:01:11.850 に答える