見出し画像

【75日目】Djangoあれこれ_プログラミング学び日記

 このnoteは、31歳未経験からエンジニアを目指して勉強していく記録を綴っているものです。現在はAdTechでカスタマーサクセスを担当しつつ、色んなチャンスに恵まれ、CS業務や子育てと並行しながらチャレンジしています。

 これからプログラミングを始める方にとってのTipsやモチベアップに繋げられるように頑張りたいと思っています。
--------------------------------------------

本日もDjangoです。汎用ビューの使い方について以下の動画で学んだことを中心に、Tipsをそれぞれ書いていこうと思います。

やはり色んなソースから学ぶと、知っている知識がどんどん肉付けされていいですね。似たようなアプリでも人によって様々な書き方があり、その都度勉強させられます。


models.pyに定義する「get_absolute_url()」メソッド

CreateViewなど、データベースを編集するViewでは処理完了後の遷移先を指定する必要があります。今回はmodels.pyにそれを設定する方法を学びました。モデルの中にget_absolute_url()を定義すればOKです。

class Post(models.Model):
    created = models.DateTimeField(
        auto_now_add = True,
        editable = False,
        blank = False,
        null = False
    )

----- 中略 -----
 
    def __str__(self):
        return self.title
    
    def get_absolute_url(self):
        return reverse_lazy("detail", args=[self.id])

モデルで定義しておくと何が良いかというと、これがデフォルトの遷移先として設定されることです。

CreateViewでは処理実行後、デフォルトでは新規作成したデータのDetailページに遷移するようになっています。ただ、何もしなければDjangoは遷移先のURLが分からないので、ここで教えてあげているイメージです。

reverse_lazyはurlタグと同じ機能で、urlを取得するためのものです。urlが入ったコンテキスト変数であるdetailを、argsという引数に入ったidと合体させて取得しています。argsは引数をタプル型で関数に渡すためのものです。argsという名前じゃないとダメみたいで、名前だけkwargsに変えてみたところ、「django.urls.resolvers.URLResolver._reverse_with_prefix() argument after ** must be a mapping, not list」というエラーがでました。

ちなみに遷移先を指定したい場合は、Todoアプリで作成したようにviews.pyで指定すればOKです。その場合は「get_success_url()」を使います。

class Create(CreateView):
    model = Post
    fields = "__all__"

    def get_success_url(self):
        return reverse_lazy("detail", kwargs={'pk':self.object.pk})

こちらではobjectのidを辞書型で関数に渡しています。modelだと直接指定できるけど、Viewだとmodelから受け取って指定する、というのが理由なのかなと思っています。


UpdateViewはCreateViewと同じTemplateを使う

登録した内容を修正する機能を持つUpdateViewは、デフォルトではCreateViewと同じTemplateが使われます(モデル名_form.html)。そのため、同じで良ければ新たにテンプレートを作る必要はないです。


ForeignKeyやManyToManyFieldで他モデルを紐づけた場合、自動的にテンプレートでプルダウンになる

何か設定が必要なのかと思いましたが、自動で作成されるみたいでした。もちろん見た目を編集することも可能なようです(まだ試せていませんが)。

class Post(models.Model):
    category = models.ForeignKey(
        Category,
        on_delete=models.CASCADE)

    tags = models.ManyToManyField(
        Tag,
        blank=True)

それぞれCategoryとTagという別のモデルと紐づいています。
テンプレートの該当部分は、以下のように他フィールドと一緒に{{ form.as_p }}で表示させています。

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <input type="submit" value="投稿" class="btn btn-primary" />
</form>

すると以下のような画面になります。


夜は仕事をしなければならなかったので、今日はここまでです。ここで学んだことをTodoアプリに反映させるところまで行きたかった…!



これまで修了したコース等

【YouTube】
Pythonでウェブサービスを作ろう! #1
テンプレートをマスターしよう! #2
静的ファイルを配信しよう !#3
本番公開しよう! #4
データベースと接続しよう! #5
ブログを作って学ぶモデル入門! #6
これが汎用ビューの力! #7

【Paiza】
Aランクレベルアップメニュー 24/49問
ループメニュー1 20/20問
ループメニュー2 12/20問
配列メニュー      56/64問
条件分岐メニュー    25/25問
二重ループメニュー   19/19問
配列活用メニュー    26/26問
文字列処理メニュー   30/30問
Bランクレベルアップメニュー 62/62問
Cランクレベルアップメニュー 30/30問
ランクB合格
ランクC合格

【書籍/ブログ】
Django入門 | 初心者でも1時間でWebアプリ(Todoアプリ)を作成するコース
基礎からのMySQL     514/514頁
Web技術の基本      189/189頁 ※2周目中
京大のPython教科書    116/201頁
Pythonデータベースプログラミング 194/194頁
Pythonエンジニアファーストブック読了

【Progate】
Python Ⅰ~Ⅴ
Python アプリ版 コースⅠ~Ⅴ
SQL Ⅰ~ Ⅳ
SQL アプリ版 コースⅢ
HTML&CSS 初級編

【その他】
Pythonの環境構築
VSCodeの環境構築
MySQLの環境構築(MAMP)
Git / GitHubの環境構築
HEROKUの環境構築

この記事が気に入ったらサポートをしてみませんか?