diadia

興味があることをやってみる。自分のメモを残しておきます。

makemigrationsでNo changes detectedが返される場合

参考URL
https://www.monotalk.xyz/blog/django-model-%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%81%8Cmakemigrations-%E3%81%A7-no-changes-detected-%E3%81%AB%E3%81%AA%E3%82%8B/

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は自動で作ってくれる。これは少ない記述量で完成することができて便利である。

参考url
https://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使い方


セレクタの書き方

セレクタはhtmlタグを単純に書くだけではない。

例えばheaderのh2属性のみにcssを適用したい場合には以下のように書く。

header h2{
          color : black ;
           }

リンクが青色で下線部が引かれている状態を直す場合

css

header nav ul li a{
             font-size : 20px;
             color : black;
             text-decoration : none;
                 }

idを用いたセレクタの書き方

セレクタはhtmlのタグだけでなく、タグ内の属性をセレクタとして利用できる。

その差異にはid名の直前に#を記述すること。

html

<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には優先順位がある。あるセレクタに対しcssが複数ある場合には優先順位のルールが適用される。それは命令したセレクタがより直接的なcssが優先される。


css

*{
     margin : 0;
     padding : 0;
     list-style : none;   
}

上記cssの意味は、すべての空白を埋めることと、リストのアイコン設定を無しにする。

css使い方

関連記事

すべての要素を対象にするセレクタの書き方
セレクタの書き方
テキストスタイル関連
ボックスのスタイル
背景のスタイル

css使い方

種類

  1. html内のタグに属性として直接書く方法
  2. html内headタグ内にcssを記述する方法(インラインcss)
  3. htmlファイルとは別にcssファイルを作り読み込ます方法(外部css)

1.html内のタグに属性として直接書く方法

cssの基本的な構文とは異なる方法で記述する。今後廃止される記述方法なので参考程度に。

.html
<h1 style="background-color: green;">cssの使い方</h1>

2.html内headタグ内にcssを記述する方法(インラインcss)

.html
<head>
    <style>
        h1{
              background-color: green;
              font-size: 100px;
            }
    </style>
</head>

3.htmlファイルとは別にcssファイルを作り読み込ます方法(外部css)

.html
<head>
    <link href="path/path" media="all" rel="stylesheet" type="text/css"
</head>

mediaはスマホの場合にcssを適用するとか端末によってcssを適用するか分けることができる。allの場合はいかなる端末でも反映させるって意味。

.css
@charset:"utf-8";
h1{
              background-color: green;
              font-size: 100px;
            }

その他importタグを使った方法もあるらしい。

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のインスタンスの要素を変更したいときに使う?