質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

解決済

1回答

5021閲覧

Djangoでform作成時にviews.pyで使うgetメソッドとpostメソッドについて

treasur49148167

総合スコア13

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2019/04/06 15:25

前提・実現したいこと

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メソッドを使う方法があれば教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ちょっと端的な回答になってしまいますが、、
ウェブをクロールしているときは、常にGETメソッドです。
他方、html内のformでPOSTの指定をすることで、POSTメソッドとしてデータが送信されます。
ですので、GETが重複することはありません。
request.method='GET'という形で指定することが可能です。
そして、GETメソッドを指定して実行される内容は、リンクをたどってウェブサイトを見た時と同じ処理になります。

投稿2019/04/07 07:11

ryotax

総合スコア142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問