Agile育成ブログ
未来を変える喜びを
Django

Django_view


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

ブラウザ上で入力されたデータのやり取りが行われる。

urls.pyの作成

view.pyの作成

You cannot copy content of this page