makemigrationsでNo changes detectedが返される場合
python manage.py makemigrations
参考先によると上記のコマンドを下記に変えて試してみよ、とのことだった。
python manage.py makemigrations appname #appname はpython manage.py startapp hoge でアプリを作った際のhogeの部分
自分の場合はこれでも以下のエラーメッセージが出てしまった。
App 'products' could not be found. Is it in INSTALLED_APPS?
これは自分のアプリ名productsが見つからない。INSTALLED_APPSに有るのか?って言われている。そこでsettings.pyのINSTALLED_APPSにそのアプリを追加してみたら解決した。
結論
settings.pyでモジュール(app名)をINSTALLED_APPSに記入してないので追記すること。
これが今回のエラーの対処法だった。
ModelFormなるもの
ベース記事
formの扱い方 まとめModelForm
ModelFormの有用性
今までフォームに関しては、htmlで記載する方法と、forms.Formの継承として記述する方法を使ってきた。これらの方法とは別にforms.ModelFormを使ったフォームの作成手法があることがわかった。forms.Formでフォームの定義をしていたのだが、models.pyのモデルに基づいたformをModelFormは自動で作ってくれる。これは少ない記述量で完成することができて便利である。
参考urlhttps://docs.djangoproject.com/ja/2.1/topics/forms/modelforms/#module-django.forms.models
Django ModelFormをカスタマイズする | ぷろぐら×でざいん
https://torina.top/detail/277/
3者の比較
htmlで書く場合
htmlで書く場合のストーリーは以下のようなものだろう。html上にmodels.pyで定めた要素に従ったフォームを記述。views.pyでrequest.POST["hoge"]でクライアントの入力値を取得。入力値に基づいてクラスインスタンスを作成。
- models.pyにてクラス作成
- html上でformタグ類を書く
- views.pyを記述
forms.pyで書く場合
まずmodels.pyでテーブルを書く。その次にforms.pyでmodels.pyに対応したformを書く(ここが面倒)。その次にhtml上で{{ form }}のような形で記述を省略する。そしてviews.pyを記述する。
- models.pyにてクラス作成
- forms.pyでmodels.pyに対応した形で書く
- html上で{{ form }}と省略して書く
- views.pyを記述
ModelFormをつかう場合
models.pyでテーブルを書く。forms.pyでModelFormによって省略した形で書く。html上で省略した形で書く。views.pyを書く。
- models.pyにてクラス作成
- forms.pyでModelFormを使い省略して書く
- html上で{{ form }}と省略して書く
- views.pyを記述
cssプロパティメモ
メモ
よく使うと思われるプロパティについてメモを残す。
テキストを中央寄せする場合
p{ text-align : center ; }
セレクタの書き方
関連記事
css使い方セレクタの書き方
セレクタはhtmlタグを単純に書くだけではない。
例えばheaderのh2属性のみにcssを適用したい場合には以下のように書く。
header h2{ color : black ; }
リンクが青色で下線部が引かれている状態を直す場合
cssheader nav ul li a{ font-size : 20px; color : black; text-decoration : none; }
idを用いたセレクタの書き方
セレクタはhtmlのタグだけでなく、タグ内の属性をセレクタとして利用できる。
その差異にはid名の直前に#を記述すること。
<h2> <input id="fullname" type="text"> </h2>
であるならば
h2#fullname{ font-size : 30px; }
classを用いたセレクタの書き方
idをセレクタとするときは#を使うのに対し、classを使う場合は.(ピリオド)を使う。
<h2 class="text_center">CSS使い方</h2> <p>............................................................................................</p> <h2 class="text_center">使用上の注意点</h2> <p>................................................................</p> <h3 class="text_center">例外</h3>
であるならば、
.text_center{ text-align : center ; }
こう書くことでタグh2,h2,h3のテキストが中央寄せになる。
css使い方
関連記事
すべての要素を対象にするセレクタの書き方セレクタの書き方
テキストスタイル関連
ボックスのスタイル
背景のスタイル
css使い方
種類
1.html内のタグに属性として直接書く方法
cssの基本的な構文とは異なる方法で記述する。今後廃止される記述方法なので参考程度に。
.html
<head> <style> h1{ background-color: green; font-size: 100px; } </style> </head>
3.htmlファイルとは別にcssファイルを作り読み込ます方法(外部css)
addEventListenerの使い方
関連記事
イベントとイベントハンドラの設定addEventListenerの使い方
意義としてはonclick等は一つのイベントに一つのイベントハンドラしか設置できない。一つのイベントに複数のイベントハンドラを設置するときにに役に立つ。
サンプル使用例
<!DOCTYPE html> <html lang="utf-8"> <head> <meta charset="utf-8"> <title>ボタンクリックでコンソールログ表示とアラートの表示</title> </head> <body> <button id="btn" type="submit">表示する</button> <script> var btn = document.getElementById("btn"); window.onload = function(){ btn.addEventListener("click", function(){ console.log("load成功"); }); btn.addEventListener("click", function(){ alert("load成功"); }); } </script> </body>
loadについて
ほか関連記事
DOM操作についてイベントとイベントハンドラ
本題
loadはイベントの一つ。関連付けられた要素を読み終わったときに発生するイベント。
loadの有用性
DOM操作をすると実行タイミングがずれることでエラーになることがある。この解消に2つの方法がある。
HTML内にjavascriptを書く際に場所に注意する。onloadイベントを使う。
使用サンプル
<!DOCTYPE html> <html lang="utf-8"> <head> <meta charset="utf-8"> <title>loadについて</title> </head> <body> <button id="btn" type="submit">表示する</button> <ol id="blank"></ol> <script> window.onload = function(){ console.log("load成功") } </script> </body>
他の使い方としてはwindow.onload=function(){}のほかに要素オブジェクト.onload=function(){}の使い方もある。
views.py の目的[まとめ]
関連記事
views.pyの要点
views.pyの目的はテンプレートにデータ(データベース情報も含む)を渡す。
ここから導けることは、views.py内で行わなければならないことは、テンプレートに渡すべき情報を選択すること、どのテンプレートに渡すかを定めること。この多くても2点を規定するに過ぎない。
テンプレートに渡すべき情報を選択すること
典型的な方法には2系統ある。renderを使ってcontext内に表示したいデータを選択、編集し格納する方法と、クラスベースドビュー内でデータを選択、編集する方法だ。
記述の仕方:情報の選択(仮説)
テンプレートにインスタンス情報を渡す場合にはviews.pyでインスタンスを選択するコードを記述する流れに持ち込む。
おそらく鉄則らしきものが見つかったのでメモしておく。
最初にインスタンスがあるかどうかクエリセットから探す。ある場合はクエリセットから抽出する。
インスタンスがない場合にあたったときに初めてインスタンスを作成(create)する流れに持ち込む。この順番が重要だと思う。
is_safe_urlのソースコード
is_safe_urlについての情報がないので探してみた。
ソースコード
def is_safe_url(url, allowed_hosts, require_https=False): """ Return ``True`` if the url is a safe redirection (i.e. it doesn't point to a different host and uses a safe scheme). Always return ``False`` on an empty url. If ``require_https`` is ``True``, only 'https' will be considered a valid scheme, as opposed to 'http' and 'https' with the default, ``False``. """ if url is not None: url = url.strip() if not url: return False if allowed_hosts is None: allowed_hosts = set() # Chrome treats \ completely as / in paths but it could be part of some # basic auth credentials so we need to check both URLs. return (_is_safe_url(url, allowed_hosts, require_https=require_https) and _is_safe_url(url.replace('\\', '/'), allowed_hosts, require_https=require_https))
urls.pyの使い方
関連記事
Django リンクについて本題
urls.pyの役割はページ遷移させることだ。ただurls.pyの使い方は一つではないことに気が付かなかった。
少し広くなった視点をメモに残す。
1.developer側の使い方
アプリケーション作成者にとってはブラウザ上にアドレスを記述することでページ遷移させる。これはユーザー側のための設計ではない
2.ユーザ側の使い方
ユーザー側がページを遷移させる場合には、ページ上のボタンをクリックすることでページを遷移させるのが普通。ボタンをクリックさせページ遷移をするのがもう一つのurls.pyの使い方。
この使い方はhtml上にボタンを設置する。そのボタンにはurls.pyのpathの名前を記述する。そうすることでページ遷移を可能にさせている。
参考Django リンクについて
post_save,pre_saveの使い分けについて[仮説]
どのような場面でシグナルのpost_save,pre_saveを使いわけるのか理解していない。
今のイメージを書きとどめておく。
pre_save:
class A のインスタンスaのプロパティxを変更する。プロパティxを変更すると、xに関連して他のプロパティyも変更する必要がある。
つまりa.xを変更すると、一緒にa.yも変更したいという要望がある。a.xの変更をa.save()で確定する前に、a.yの変更を差し込むってのがpre_save()の役割。
同一クラスの同一インスタンスの2要素を同時に変更したいときにpre_save()を使う?
post_save():
class Aのインスタンスaのプロパティxを変更する。この変更を確定として、別のclass Bのインスタンスの要素を変更したいときに使う?