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

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

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

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

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

4回答

2569閲覧

Djangoのコントローラーとアクションについて どのような構成にすべきか

spring_boot

総合スコア12

Django

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

Framework

Frameworkは、アプリケーションソフトを開発する際に、一般的な機能をより簡単に、より早く完了させる事を目的とした、ソフトウェアやライブラリのセットを指します。開発にフレームワークを使用する事で、追加で必要となる機能だけを開発するだけで済む為、開発効率の向上が見込めます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/07/06 06:49

編集2018/07/06 08:15

初めてDjangoを使っています。

これまでの主な制作経験はPHP(Codeigniter)などです。
Railsなどもいじっております。

今回お聞きしたいのは、「python manage.py startapp」のコマンドで作られる
一連のファイルをどのようにとらえればよいかです。

pythonにはコントローラという言葉が存在していないようです。
その役割をおっているのがviews.pyかと思いますが、単純に一つのappに存在する
views.pyが一つのコントローラと考えて、機能ごとにアプリを作るのが普通でしょうか?
ただし、その場合はstaticやhtmlのベースファイルがapp内に存在するのはおかしいので
デフォルト設定を変更してappと同じ階層に作り直す必要があります。
感覚的にはこの構成が正解かと思っています。しかし、他のapp内のモデルを使いたい場合なども出てくるのでなぜフォルダ管理しているのか首をかしげます。

もしくはappフォルダひとつが一つのWEBサービスと考えることもできるかと思います。
どうにも市販の教材はこのようにとらえているようですがコントローラとアクションの考え方に慣れた私にはどうにもしっくりきません。この場合はviews一枚でコントローラ的な管理は厳しいのでクラスファイルを複数作成していく形になるかと思いますが、いずれにせよコントローラとアクションという役割分担はできていないと思います。

マニュアルも読んでいる最中ですが、基本的な制作の構成に関してご教授いただけるとありがたいです。

*追記
これから検証しますが、モデルが別のアプリフォルダ内にあっても外部キーを設定してあれば
結合は自動で行われているかもしれません。

また、urlsのurlpatternsは各アプリ間で上書きされていることから一続きの処理だということもわかりました。やはり基本的には他のフレームワークにおける1コントローラをフォルダとしてまとめており、views.pyの関数がアクションを担当しているという認識で正しいのかもしれません。ご意見お願いいたします。

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

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

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

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

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

guest

回答4

0

そうですね。

Djangoは
プロジェクト内に複数のアプリを作っていく感じですね。

オススメの作り方は「ユーザ登録」を独立したアプリにすることです。

python3 manage.py startapp usersapp

とすると
「usersapp」というフォルダーに必要なファイルが自動的に作られます。
(python3としているのはpythonのバージョン指定が必要なOS環境があるため)

SignUp,Login,Logout等のユーザ登録関係のフォームを作るところから始めてはどうですか?

それからサービスアプリ(ショッピングやブログ等の提供したいサービス)を
shopsapp,blogsappみたいな名前で
それぞれのアプリで作っていくのが良いと思います。

こうすることでアプリを個別にバージョンアップさせることが可能になり
保守性が高いサービスの実現が可能です。例えばそれぞれの機能が独立したアプリになっていないと
ブログをイジったことで他のサービスに影響することもあるのです。
だから、データモデルもテンプレートもアプリ毎に定義するようになってます。

もちろん

ユーザー管理は最初から実装されてるので、それをそのまま使うことが出来ます。

一番最初にしなくてはいけないのはプロジェクト側のurls.pyとは別にアプリのフォルダーにもう一つurls.pyファイル作って、urlパターン定義のつなぎこみをします。これがひと手間かかるのですが、なれるとどうってことは無いですね。

staticファイルやhtmlテンプレートの置き場所も開発中と運用中で違って当然です。それはsettings.pyをイジって変えれば済むことです。

初期の設定は
複数の人員での開発を想定しているので、アプリ内にその様なファイルを置く仕様になっているんですよ。

Railsの経験があるようですが、開発言語が違ったらコーディングの哲学も変わります。
Djangoは良くも悪くも、Python文化です。
pythonコミュでは
暗示的な魔法のようなコードを嫌う傾向があります。
何でもきちんと明示的に定義する必要があります。
コード量は増えますが、誰が読んでも理解できるコードが好まれます。
試しにmanage.pyを開いて見てください

python

1def main(): 2 """Run administrative tasks.""" 3 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'boardproject.settings') 4 try: 5 from django.core.management import execute_from_command_line 6 except ImportError as exc: 7 raise ImportError( 8 "Couldn't import Django. Are you sure it's installed and " 9 "available on your PYTHONPATH environment variable? Did you " 10 "forget to activate a virtual environment?" 11 ) from exc 12 execute_from_command_line(sys.argv)

execute_from_command_line()関数は
コマンドラインを実行するって意味でしょうけど、見た瞬間「書いてあるままだー」って思いましたね。

投稿2021/04/27 18:57

編集2021/04/27 19:25
Django_admin

総合スコア6

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

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

0

https://docs.djangoproject.com/en/2.0/misc/design-philosophies/

Railsのご経験がおありなんですかね? あまりひきづられずにDjango流に考えるといいと思います。 機能ごとにappを分けているのがいい様です。modelが10前後を超える場合は分割するとわかりいいかもしれません。 あとdjangoの機能じゃないものは無理にどこかのファイルにいれようとしないで、独自の新ファイルにコードを書くほうが私は好きです。

投稿2018/07/10 05:17

Kentaro0919

総合スコア258

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

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

0

pythonにはコントローラという言葉が存在していないようです。

Pythonにコントローラーという言葉がないのではなくて、Djangoがコントローラーを考えて設計してないという話だと思います。

その役割をおっているのがviews.pyかと思いますが、単純に一つのappに存在する
views.pyが一つのコントローラと考えて、機能ごとにアプリを作るのが普通でしょうか?

普通ではないと思います。DjangoとRailsは設計が違うので、Djangoを使うならRailsの考え方はおいといて、Djangoの設計を学ぶと良いかと思います。

投稿2018/07/06 15:06

mtb_beta

総合スコア181

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

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

0

もしくはappフォルダひとつが一つのWEBサービスと考えることもできるかと思います。

私はこのイメージですね。
startappでアプリケーションの実装が始まるので、やはりフォルダ=アプリケーションかなと。

投稿2018/07/06 10:23

tatamyiwathy

総合スコア1039

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問