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

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

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

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

解決済

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

treasur49148167
treasur49148167

総合スコア0

Django

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

1回答

0評価

0クリップ

3886閲覧

投稿2019/04/06 15:25

前提・実現したいこと

Django初心者です。

現在、データベースに登録した本の一覧を表示したり、新しい本を作成したりできる簡単なDjangoプロジェクトを作っています。
アプリケーション名は「shop」です。

今回はこのプロジェクトに関して、特にエラーが出ているわけではないですが、formについて疑問が生じたので、質問させて頂きました。

疑問の部分は、フォームから本を新規登録するところです。
具体的には、shop/views.py内にあるBookCreateViewクラスの中のgetメソッドとpostメソッドです。

まずは、以下にmodels.py、views.py 、forms.pyを示します。

models.pyのコード

Python

from django.db import models class Book(models.Model): """本モデル""" class Meta: db_table = 'book' title = models.CharField(verbose_name='タイトル', max_length=20) price = models.IntegerField(verbose_name='価格', null=True, blank=True) def __str__(self): return self.title

urls.pyのコード

python

from django.urls import path from . import views app_name = 'shop' urlpatterns = [ path('', views.index, name='index'), path('create/', views.create, name='create'), ]

views.pyのコード

Python

import logging from django.shortcuts import render from django.views.generic import View from django.shortcuts import render, redirect from .forms import BookForm from .models import Book logger = logging.getLogger(__name__) class BookIndexView(View): def get(self, request, *args, **kwargs): context = { # 本レコードの一覧を取得 'book_list': Book.objects.all(), } # ショップ画面を表示 return render(request, 'shop/book_list.html', context) index = BookIndexView.as_view() class BookCreateView(View): def get(self, request, *args, **kwargs): context = { # 空のフォームを作成 'form': BookForm(), } # 登録画面を表示 return render(request, 'shop/book_form.html', context) def post(self, request, *args, **kwargs): # リクエストの入力データをフォームオブジェクトに変換 form = BookForm(request.POST) # バリデーション実行 if not form.is_valid(): context = { 'form': form, } # 登録画面を再表示 return render(request, 'shop/book_form.html', context) # モデルオブジェクトを保存 form.save() # ショップ画面にリダイレクト return redirect('/shop/') create = BookCreateView.as_view()

forms.pyのコード

Python

from django import forms from .models import Book class BookForm(forms.ModelForm): class Meta: model = Book fields = ('title', 'price',)

book_form.htmlのコード

html

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>サンプル</title> <style> form label { width: 20%; float: left; } </style> </head> <body> <form method="post" action="/shop/create/"> {{ form.as_p }} {% csrf_token %} <button type="submit">登録</button> </form> </body> </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メソッドを使う方法があれば教えて頂きたいです。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Django

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