自動化無しに生活無し

WEB開発関係を中心に備忘録をまとめています

  • 【Django】デフォルトの認証機能を網羅し、カスタムユーザーモデルとメール認証も実装させる【脱allauth】

    前置き 最近のDjango-allauthは大きく仕様が変わりつつある。 settings.pyの編集がこれまでのものとは異なる。 ソーシャル認証ができるという強みから、かなり昔から扱ってきたが、APIの仕様が変化し続けている中であえて実装するのはとても手間だ。 故に、本格的にDjangoのデフォルトの認証機能を扱うことにした。 カスタムユーザーモデル実装とメール認証を前提として。 実装にあたって これまでDj ...
  • 【Django】views.pyでユーザーモデルを扱う時は get_user_model を使う

    これまで、ユーザーモデルをimportする時 from django.contrib.auth.models import User もしくは、カスタムユーザーモデルの場合 from users.models import CustomUser などとしてきたが、これでは通常のユーザーモデルから、カスタムユーザーモデル導入時にimport文をすべて書き換える必要が出てくる。 アプリが複数であれば、それをすべて書き換えていくのはとても面倒。 そこで、get_user_model を使う。これにより、カスタムユーザーモデルの転換時のコード編集の手間を減 ...
  • 【Django】models.pyからforms.py及びadmin.pyを自動的に作る【コマンド1発で生成】

    Djangoプロジェクトを何度も何度も作っていてふと思う。 models.pyからforms.py、admin.pyを作る時がすごいめんどくさいと。 どれも似たようなコードになるので、これは自動生成してしまったほうが容易いなと。 故に、本記事ではmodels.pyからforms.py及びadmin.pyを自動生成するPythonコードをまとめる。 ※ファイルを読み込んで追記する仕様上、実行は自己責任でお願 ...
  • Djangoのmanage.pyのコマンドをsystemdから動かして常駐化【データを常にチェックし、Sendgridでメール送信】

    Djangoでは、manage.pyコマンドを追加することができる。 参照: 【Django】manage.pyコマンドを追加させる【バッチ処理、常駐プログラムなどに】 これにより、例えばTodoリストの期限が切れたデータをチェックして、Sendgridを使ってメールで通知できる。 しかし、デプロイをした後は別途systemdによる管理が必要になる。 本記事では、デプロイ後のmanage.pyの独自コマンド ...
  • 【Ubuntu】systemdでPythonファイルを動作させる【常駐スクリプトに】

    このPythonコードを動作させる。ファイルパスは~/Documents/systemd/test.py import datetime, time while True: with open("test.txt", mode="w") as f: f.write( str(datetime.datetime.now()) ) time.sleep(1) 必要最小限度の serviceファイルが以下。ファイルパスは/etc/systemd/system/testpython.serviceとする。 [Unit] Description=write text file After=network.target [Service] ExecStart=/usr/bin/python3 test.py WorkingDirectory=/home/testuser/Documents/systemd [Install] WantedBy=multi-user.target 下記で動作できる。 sudo systemctl start testpython.service 動作中は/home/testuser/Documents/systemd/te ...
  • 【Django】.getlist()でtype="checkbox"のチェックの有無を調べる【複数人の権限の指定に有効】

    背景 とあるプロジェクトを作るとして、複数人のユーザーが紐づくとする。 ユーザーごとに読み込み、書き込み、実行の権限を割り当てて行く必要がある。 これを1回のリクエストで送信するとき、どう実現させるべきか。 問題 .getlist() を使うことで、同じname属性の値をすべて取得することができる。 しかし、type="checkbox"の場合はその限りではない。 例えば、以下のようなフォームの場合。 <form method="POST"> {% csrf_token %} ...
  • 【Django】getlistを使って複数枚の画像をまとめて送信する【サムネイルが表示される専用フォームあり】

    以前解説した、 inputタグのtype=‘file’で画像のサムネイルを表示させる を使って、複数の画像をgetlistを使ってアップロードできるように仕立てる。 通販サイトでは、1つの商品に複数枚の画像がセットされることが多いので、そちらに対応させる。 解説 モデル from django.db import models from django.utils import timezone class Topic(models.Model): dt = models.DateTimeField(verbose_name="投稿日時&q ...
  • テキストエリアに入力時に、Tabキーを押してタブを入力する【マークダウンやコードの入力に有効】

    直接コードを入力する場合に有効。 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Hello World test!!</title> </head> <body> <textarea id="textarea"></textarea> <script> const textarea = document.querySelector('#textarea'); textarea.addEventListener('keydown', function (e) { if (e.key === 'Tab') { // デフォルトの動作(フォーカスの切り替え)を防止 e.preventDefault(); // カーソル位置の前と後を取得 const start = this.selectionStart; const end = this.selectionEnd; // カーソル位置にタブ文字を挿入 const tab = '\t'; this.value = this.value.substring(0, start) + tab + this.value.substring(end); // カーソル位置を調整(タブを入力した後にカーソルを移動) this.selectionStart = this.selectionEnd = start + 1; } }); </script> </body> </html> 動かすとこうなる 半角スペース4文字分にするには? <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Hello World test!!</title> </head> <body> ...
  • DjangoでManyToManyFieldを使い、中間テーブルのモデルを取得する【多対多のthrough】

    例えば、こういうモデル構造の場合、 from django.db import models class Person(models.Model): name = models.CharField(max_length=128) def __str__(self): return self.name class Group(models.Model): name = models.CharField(max_length=128) members = models.ManyToManyField(Person, through='Membership') def __str__(self): return self.name class Membership(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE) date_joined = models.DateField() invite_reason = models.CharField(max_length=64) 通常、Groupモデルの、membersフィールドで呼び出せるのは、紐付いているPersonモデルのオブジェクトである。 中間テーブルのモデルであるMembershipではない。 もし、membersフィールドからMembershipモデルのオブジェクトを取り出したい場合は、 group = Group.objects.all().first() memberships = ...
  • DjangoでBootstrapを使う【pip install django-bootstrap-form】

    DjangoのBootstrap関係のライブラリは混在しているので、仕事で使うものを覚書に記録。 pip install django-bootstrap-form をインストールして、INSTALLED_APPSに "bootstrapform" を追加する。 テンプレートで、 {% load bootstrap %} {{ form|bootstrap }} として呼び出す。 ...