前提・実現したいこと
Django初心者です。
現在、データベースに登録した本の一覧を表示したり、新しい本を作成したりできる簡単なDjangoプロジェクトを作っています。
アプリケーション名は「shop」です。
今回はこのプロジェクトに関して、特にエラーが出ているわけではないですが、formについて疑問が生じたので、質問させて頂きました。
疑問の部分は、フォームから本を新規登録するところです。
具体的には、shop/views.py内にあるBookCreateViewクラスの中のgetメソッドとpostメソッドです。
まずは、以下にmodels.py、views.py 、forms.pyを示します。
models.pyのコード
Python
1from django.db import models 2 3 4class Book(models.Model): 5 """本モデル""" 6 7 class Meta: 8 db_table = 'book' 9 10 title = models.CharField(verbose_name='タイトル', max_length=20) 11 price = models.IntegerField(verbose_name='価格', null=True, blank=True) 12 13 def __str__(self): 14 return self.title
urls.pyのコード
python
1from django.urls import path 2 3from . import views 4 5app_name = 'shop' 6urlpatterns = [ 7 path('', views.index, name='index'), 8 path('create/', views.create, name='create'), 9]
views.pyのコード
Python
1import logging 2 3from django.shortcuts import render 4from django.views.generic import View 5from django.shortcuts import render, redirect 6 7from .forms import BookForm 8from .models import Book 9logger = logging.getLogger(__name__) 10 11 12class BookIndexView(View): 13 def get(self, request, *args, **kwargs): 14 context = { 15 # 本レコードの一覧を取得 16 'book_list': Book.objects.all(), 17 } 18 # ショップ画面を表示 19 return render(request, 'shop/book_list.html', context) 20 21 22index = BookIndexView.as_view() 23 24 25class BookCreateView(View): 26 def get(self, request, *args, **kwargs): 27 context = { 28 # 空のフォームを作成 29 'form': BookForm(), 30 } 31 # 登録画面を表示 32 return render(request, 'shop/book_form.html', context) 33 34 def post(self, request, *args, **kwargs): 35 # リクエストの入力データをフォームオブジェクトに変換 36 form = BookForm(request.POST) 37 # バリデーション実行 38 if not form.is_valid(): 39 context = { 40 'form': form, 41 } 42 # 登録画面を再表示 43 return render(request, 'shop/book_form.html', context) 44 # モデルオブジェクトを保存 45 form.save() 46 # ショップ画面にリダイレクト 47 return redirect('/shop/') 48 49create = BookCreateView.as_view() 50
forms.pyのコード
Python
1from django import forms 2 3from .models import Book 4 5 6class BookForm(forms.ModelForm): 7 class Meta: 8 model = Book 9 fields = ('title', 'price',) 10
book_form.htmlのコード
html
1<!DOCTYPE html> 2 <html lang="ja"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>サンプル</title> 6 <style> 7 form label { 8 width: 20%; 9 float: left; 10 } 11 </style> 12 </head> 13 <body> 14 <form method="post" action="/shop/create/"> 15 {{ form.as_p }} 16 {% csrf_token %} 17 <button type="submit">登録</button> 18 </form> 19 </body> 20 </html>
疑問点
気になった部分は、views.pyのBookCreateViewの中のgetメソッドとpostメソッドについてです。
まず、私の認識に間違いがあるかもしれないので、getメソッド、postメソッドについて確認させてください。
どこか別のページから、ユーザーがshop/createページ(空のフォームを表示するページ)にアクセスした際に、GETメソッドでやり取りするため、BookCreateViewのgetメソッド(postメソッドではなく)が呼び出されると認識しております。
また、shop/createページでユーザーからformが送信されると、POSTメソッドでやり取りするため、BookCreateViewのpostメソッドが呼び出されると認識しております。
ここで、疑問なのですが、form送信をGETメソッドに変更した場合、BookCreareViewのpostメソッドをgetメソッドにする必要があると思います。
しかし、そうすると、同じBookCreateViewクラス内にgetメソッドが2つあることになってしまい(元々あったgetメソッドとpostメソッドから変更したgetメソッド)、Djangoがどっちのgetメソッドを使えば良いのか判断できなくなってしまうと考えられます。
このようにformをGETメソッドに書き換えた場合に、上手くgetメソッドを使用して、form画面の表示から送信、データベースへの反映を行う方法はありますでしょうか?
もちろん、クラスベースViewを使うなど、他に方法はあると思うのですが、Djangoについての理解を深めるためにgetメソッドを使う方法があれば教えて頂きたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/07 23:50