Django View
目次
MTVフレームワーク
Djangoでは一般のフレームワークで言うcontrollerの機能はviewにある
MVCフレームワーク | MTVフレームワーク |
---|---|
model | model |
view | template |
controller | view |
View種類
関数ベースビュー
from django.http import HttpResponse
@require_http_methods([“POST”])
def hello(request):
return HttpResponse(“hello”)
・メソッドに付加するアノテーションでhttpリクエストメソッド(get/post等)を定義
クラスベースビュー
from django.http import HttpResponse
class HelloView(View):
def get(self, request, *args, **kwargs):
return HttpResponse(“hello”)
・クラス名の引数に汎用ビューを定義
・クラス内メソッドにhttpリクエストメソッド(get/post等)を定義
クラス内メソッド
get
from .models import Test
def get(self, request, *args, **kwargs):
context = {
”object_list”: Test.objects.all(),
}
return render(request, ‘〜/index.html’, context)
get_context_data
from .models import Test
def get_context_data(self, **kwargs):
ctx = super().get_context_data(**kwargs)
ctx[‘object_list’] = Test.objects.all()
return ctx
汎用ビュー
View種類 | 機能 |
---|---|
TemplateView | htmlテンプレート表示 |
ListView | 複数レコード表示 |
DetailView | 単一レコード表示 |
CreateView | レコード追加 |
UpdateView | レコード更新 |
DeleteView | レコード削除 |
TemplateView
from django.views.generic import TemplateView
class IndexView(TemplateView):
template_name = ‘index.html’
ListView
from django.views.generic import ListView
from .models import TestModel
class TestListView(ListView):
template_name = ‘test/list.html’
model = TestModel
#省略可。省略時は{{ object_list }}で呼び出し
context_object_name = ‘tests’
paginate_by = 10
DetailView
from django.views.generic import DetailView
from .models import TestModel
class TestModelDetailView(DetailView):
template_name = ‘test/detail.html’
model = TestModel
#省略可。省略時は{{ object }}で呼び出し
context_object_name = ‘test’
CreateView
from django.views.generic import CreateView
from django.urls import reverse_lazy
from .models import TestModel
class TestModelCreateView(CreateView):
template_name = ‘test/create.html’
対象model
model = TestModel
fields = [‘title’, ‘body’]
処理成功時のリダイレクトURL
success_url = reverse_lazy(‘sample_app:index’)
UpdateView
from django.views.generic import UpdateView
from django.urls import reverse_lazy
from .models import TestModel
class BoardPostUpdateView(UpdateView):
template_name = ‘test/update.html’
model = TestModel
fields = [‘title’, ‘body’]
処理成功時のリダイレクトURL
success_url = reverse_lazy(‘sample_app:index’)
DeleteView
from django.views.generic import DeleteView
from django.urls import reverse_lazy
from .models import TestModel
class BoardPostDeleteView(DeleteView):
template_name = ‘test/update.html’
model = TestModel
処理成功時のリダイレクトURL
success_url = reverse_lazy(‘sample_app:index’)