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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1386閲覧

Djangoの汎用ビュー(クラスベースビュー)と関数ベースビューを同時に使ってもよろしいのでしょうか?

nonameman

総合スコア1

Django

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2020/09/09 01:47

編集2020/09/09 01:48

前提・実現したいこと

Django初学者です。表題の繰り返しになってしまいますが、
Djangoの汎用ビュー(クラスベースビュー)と関数ベースビューを同時に使ってもよろしいのでしょうか?
素朴な疑問なのですが、検索しても解決しませんでしたので、質問させていただきました。

現在、開発しているものでは汎用ビューのみを使っていますが、フォームAPIを使わずにHTMLの独自のフォームを用いて値をDjangoのモデルに登録する際に、関数ベースビューを用いているこちら[※]を参考にしたいと考えております。
違った種類のビューを同一のviews.py上で作成してもよいのでしょうか?もし、同時に使ってよいとのことでしたら、用いる際に注意するべきことはありますか?

本日中には解決したいと考えておりますので、ご協力いただけると嬉しく思います。よろしくお願いいたします。

汎用ビューと混在させたい関数ベースビュー

参考リンク[※] ※同一のサイトを参照しています

from django.contrib.auth.models import User from django.shortcuts import render, redirect, get_object_or_404 from .models import Board, Topic, Post def new_topic(request, pk): board = get_object_or_404(Board, pk=pk) if request.method == 'POST': subject = request.POST['subject'] message = request.POST['message'] user = User.objects.first() # TODO: get the currently logged in user topic = Topic.objects.create( subject=subject, board=board, starter=user ) post = Post.objects.create( message=message, topic=topic, created_by=user ) return redirect('board_topics', pk=board.pk) # TODO: redirect to the created topic page return render(request, 'new_topic.html', {'board': board})

環境(ツールのバージョンなど)

CentOS8、Python3.6、Django2.2、PostgreSQL

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

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

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

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

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

guest

回答1

0

ベストアンサー

classとdefを混在して作ることはよくやっているので大丈夫だと思われます。

ログインに必要なものはdef(関数ビュー)
modelからデータを取り出してテンプレートに出すなどのものはclass(クラスビュー)
などその人が作りやすい方を使えばいいと思います。

難しいことをやる場合には、関数ビューをおすすめします。
関数ビューは複雑なことにも対応できるので、一度作ってしまえば
メンテナンス性もよく便利です。

クラスビューは簡単に作成できますが、複雑な処理が難しいため、
後で追加や変更などがわかりにくくなる場合があります。

投稿2020/09/09 02:54

setuna0531

総合スコア128

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

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

nonameman

2020/09/09 02:59

丁寧かつわかりやすいご回答ありがとうございます。 関数ビューのほうが複雑なことにも対応できるのですね! ご意見を参考にして併用して使ってみます。
setuna0531

2020/09/09 03:07

またわからないことがありましたら気軽に投稿してください! 基本的にはclassでモデルを呼び出してその中で関数ビューを呼び出して 処理をさせたりするのが一般的かもしれません! (モデルの呼出がclassは簡単にできるので) Djangoのサンプルはネットで結構落ちてるので、 一度ダウンロードしてどんな処理しているかなど見てみると 勉強になるのでおすすめです!
nonameman

2020/09/09 04:07

ありがとうございます! お返事の中で気になったのですが、classというのは汎用ビューのことでしょうか? 汎用ビューの中で関数ビューを呼び出すということでしょうか?
setuna0531

2020/09/09 04:24 編集

classは汎用ビューのことですので認識通りです! 汎用ビューの中で関数ビューを使う例を挙げておきますね ``` class Menu_List(generic.ListView): >>template_name = 'menu_list.html' #表示するテンプレート >>model = Menu #モデルの呼出 >>success_url = reverse_lazy('menu_create') #テンプレート内での処理が終わったら表示する画面 >>def get_context_data(self, **kwargs): >>>context = super().get_context_data(**kwargs) #contextの型を作成 >>>category = Category.objects.get(id=self.kwargs['id']) #categoryにIDに該当するものを入れる >>>context['category'] = category #それをcontext[]に入れる >>>context['menu'] = Menu.objects.filter(user=self.request.user, category=category) >>>return context #contextに入れた情報をテンプレートで使えるように渡す ``` こういった形で、class(汎用ビュー)でモデルと該当するテンプレートを指定して def(関数ビュー)でそのテンプレートに表示する情報を処理するといったことなどが出来ます! ※見ずらくてすみません。
nonameman

2020/09/09 04:39

ご返信ありがとうございます。例を拝見しましたが、こちらのクラス内の関数はおそらく親メソッドをオーバーライドして独自の処理を追加しているものであって、関数ベースビューとは違うかと思います(間違っていたらすみません)
ForestSeo

2020/09/09 09:47 編集

TemplateViewクラスとかだと、クラス内の関数(get関数, post関数)で、renderの処理ができます。 class Test(TemplateView): ⠀⠀⠀⠀def get(self, request): ⠀⠀⠀⠀⠀⠀⠀⠀・・・ ⠀⠀⠀⠀⠀⠀⠀⠀return render(・・・) ⠀⠀⠀⠀def post(self, request): ⠀⠀⠀⠀⠀⠀⠀⠀・・・ ⠀⠀⠀⠀⠀⠀⠀⠀return render(・・・) みたいに
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問