Warning: count(): Parameter must be an array or an object that implements Countable in /home/xs638785/agile-software.site/public_html/wp-content/plugins/rich-table-of-content/functions.php on line 490
views.py
- 関数ベースビュー
- クラスベースビュー
2通りの書き方があります。
関数ベースビュー
クラスベースビュー
django.views.generic.ListViewクラスを継承して独自のIndexViewを作成
from django.contrib.auth.mixins import LoginRewuireMixin
from django.views import generic
from .models import Bmi
class IndexView(LoginRewuiredMixin,generic.ListView):
model=Bmi
template_name='example.html'
def get_queryset(self):
return Bmi.objects.filter(user=self.request.user)
Mixinクラスを継承することでログイン制限
modelにBmiモデルをセットすることでBmiモデルとIndexViewを紐づけている。
get_querysetメソッドをオーバーライドしてテンプレートに渡すデータをログインユーザーに紐づくデータに絞っています。
1行目ではHttpResponseというクラスをimportすることで
作製したindex関数の引数としてrequestを
- View:どのような用途で使うにしても応用が利きます。
- TemplateView:テンプレートを表示することに特化したViewクラス
- RedirectView:任意のURLにリダイレクトすることに特化したViewクラス
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello,world.")
@classonlymethod
def as_view(cls, **initkwargs):
"""Main entry point for a request-response process."""
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
% (key, cls.__name__))
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class." % (cls.__name__, key))
def view(request, *args, **kwargs):
self = cls(**initkwargs)
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
view.view_class = cls
view.view_initkwargs = initkwargs
# take name and docstring from class
update_wrapper(view, cls, updated=())
# and possible attributes set by decorators
# like csrf_exempt from dispatch
update_wrapper(view, cls.dispatch, assigned=())
return view
クラスベース汎用ビュー | 説明 |
---|---|
View | シンプルな汎用ビュー |
TemplateView | テンプレートを使用して、何かを表示する汎用ビュー |
ListView | 一覧を表示する汎用ビュー |
DetailView | 詳細ページを表示する汎用ビュー |
CreateView | 新しくデータを追加するフォームを提供する汎用ビュー |
UpdateView | データを更新するフォームを提供する汎用ビュー |
DeleteView | データを削除する汎用ビュー |
RedirectView | リダイレクトに特化した汎用ビュー |
FormView | フォーム処理をする汎用ビュー |
ListView
記事の一覧を表示する。
urls.pyの作成
view.pyの作成
models.pyファイルの中のどのデータベーステーブルを使うか指定していきます。
models.pyの作成
作成したモデルの反映
htmlの作成
DetailView
データベースに入っている個別の記事を表示させるのに使う。
ListViewの場合と違ってどのデータを使うのか明示しなければいけません。
<int:pk>がテーブルに入っているデータを具体的に指定するのに使います。
Djangoではテーブルを作成した際に自動的にidというフィールドが作成され、primary keyとして重複しない番号が割り振られる。
urls.pyの作成
from django.urls import path
from app import views
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
]
views.pyの作成
https://www.agile-software.site/2021/04/25/args-%e3%80%81-kwargsn%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6%e7%90%86%e8%a7%a3%e3%81%99%e3%82%8b/class PostDetailView(View):
def get(self, request, *args, **kwargs):
post_data = Post.objects.get(id=self.kwargs['pk'])
return render(request, 'app/post_detail.html', {
'post_data': post_data
})
htmlの作成
CreateView
ブラウザ上で入力されたデータのやり取りが行われる。
urls.pyの作成
view.pyの作成
htmlの作成
投稿削除(DeleteView)
urls.pyの作成
from django.urls import path
from app import views
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('post/<int:pk>/', views.PostDetailView.as_view(), name='post_detail'),
path('post/new/', views.CreatePostView.as_view(), name='post_new'),
path('post/<int:pk>/edit/', views.PostEditView.as_view(), name='post_edit'),
path('post/<int:pk>/delete/', views.PostDeleteView.as_view(), name='post_delete'), # 追加
]
view.pyの作成
class PostDeleteView(LoginRequiredMixin, View):
def get(self, request, *args, **kwargs):
post_data = Post.objects.get(id=self.kwargs['pk'])
return render(request, 'app/post_delete.html', {
'post_data': post_data
})
def post(self, request, *args, **kwargs):
post_data = Post.objects.get(id=self.kwargs['pk'])
post_data.delete()
return redirect('index')
delete.htmlの作成
{% extends "app/base.html" %}
{% block content %}
<h2 class="my-4">{{ post_data.title }}</h2>
<hr>
<h5 class="my-4">削除してもよろしいですか?</h5>
<form method="post">
{% csrf_token %}
<button class="btn btn-danger" type="submit">削除する</button>
</form>
{% endblock %}
UpdateView
ブラウザ上で入力されたデータのやり取りが行われる。