サーチ…


前書き

一般的なビューは、オブジェクトの作成、編集、削除、またはテンプレートの表示など、あらかじめ定義された特定のアクションを実行するビューです。

一般的なビューは、必要なタスクを実行するために常に手作業で記述されている機能ビューと区別する必要があります。要約すると、汎用ビューを構成する必要があり、機能ビューをプログラムする必要があると言えます。

一般的なビューは、特に標準化された多くのタスクを実行する場合に、多くの時間を節約できます。

備考

これらの例は、一般的なビューは一般に標準化されたタスクをはるかに単純化することを示しています最初からすべてをプログラミングするのではなく、他の人がすでにあなたのためにプログラミングしたものを構成します。これは、バックグラウンドでのプロセスではなく、プロジェクトの設計にもっと集中することができるため、多くの場合意味があります。

だから、あなたはいつもそれら使うべきですか?いいえ、あなたのタスクがかなり標準化されている(オブジェクトの読み込み、編集、削除)、繰り返しのタスクが多い限り、それらは意味をなさないでしょう。 1つの特定の汎用ビューを一度しか使用しないで、非常に特殊なタスクを実行するためにすべてのメソッドをオーバーライドすることは意味をなさないかもしれません。ここで機能的なビューをお勧めします。

ただし、この機能が必要なビューがたくさんある場合や、タスクが特定の汎用ビューの定義済みタスクに匹敵する場合、汎用ビューは、より簡単なものにするために必要なものです。

最小例:機能ビューと一般ビュー

オブジェクトを作成するための機能ビューの例。コメントや空白行を除いて、15行のコードが必要です。

# imports
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect

from .models import SampleObject
from .forms import SampleObjectForm

# view functioon
def create_object(request):
    
    # when request method is 'GET', show the template
    if request.method == GET:
        # perform actions, such as loading a model form
        form = SampleObjectForm()
        return render_to_response('template.html', locals())
    
    # if request method is 'POST', create the object and redirect
    if request.method == POST:
        form = SampleObjectForm(request.POST)

        # save object and redirect to success page if form is valid
        if form.is_valid:
            form.save()
            return HttpResponseRedirect('url_to_redirect_to')

        # load template with form and show errors
        else:
            return render_to_response('template.html', locals())

同じタスクを実行するための「クラスベースの一般的なビュー」の例同じタスクを達成するには、7行のコードしか必要ありません。

from django.views.generic import CreateView

from .models import SampleObject
from .forms import SampleObjectForm

class CreateObject(CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

汎用ビューのカスタマイズ

上記の例は、タスクが完全に標準タスクである場合にのみ機能します。たとえば、ここに余分なコンテキストを追加しないでください。

より現実的な例を作りましょう。テンプレートにページタイトルを追加したいとします。機能ビューでは、これは次のように1行追加するだけで動作します。

def create_object(request):
    page_title = 'My Page Title'

    # ...

    return render_to_response('template.html', locals())

一般的なビューではこれを達成するのがより難しくなります(または:反対話的)。クラスベースであるため、目的の結果を得るためにクラスのメソッドの1つまたは複数をオーバーライドする必要があります。この例では、クラスのget_context_dataメソッドを次のようにオーバーライドする必要があります。

class CreateObject(CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

    def get_context_data(self, **kwargs):
        
        # Call class's get_context_data method to retrieve context
        context = super().get_context_data(**kwargs) 
        
        context['page_title'] = 'My page title'
        return context

ここでは、1つではなく4つのコード行を追加する必要があります。少なくとも、追加したい最初の追加のコンテキスト変数です。

ミックスインを使用した一般的なビュー

ミックスインと組み合わせると、ジェネリックビューの真のパワーが広がります。 mixinは、ビュークラスによって継承されるメソッドを持つ、あなたが定義した別のクラスです。

すべてのビューで追加の変数 'page_title'がテンプレートに表示されるようにしたいとします。ビューを定義するたびにget_context_dataメソッドをオーバーライドする代わりに、このメソッドでミックスインを作成し、このミックスインから継承するビューを作成できます。それは実際よりも複雑です。

# Your Mixin
class CustomMixin(object):
    
    def get_context_data(self, **kwargs):
        
        # Call class's get_context_data method to retrieve context
        context = super().get_context_data(**kwargs) 
        
        context['page_title'] = 'My page title'
        return context

# Your view function now inherits from the Mixin
class CreateObject(CustomMixin, CreateView):
    model = SampleObject
    form_class = SampleObjectForm
    success_url = 'url_to_redirect_to'

# As all other view functions which need these methods
class EditObject(CustomMixin, EditView):
    model = SampleObject
    # ...

これの美しさは、コードが機能的なビューのほとんどの場合よりもずっと構造化されていることです。特定のタスクの背後にあるロジック全体は、1か所に1つしかありません。また、さまざまなオブジェクトを除いて常に同じタスクを実行するビューが多数ある場合は、時間を大幅に節約できます



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow