自動化無しに生活無し

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

  • 【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の独自コマンド ...
  • 【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 ...
  • 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 }} として呼び出す。 ...
  • Django-summernoteでアップロード上限を設定する

    デフォルトで、Django-summernoteにアップロードできるファイルサイズには上限が設定されている。 こちらで上限を開放できる UPLOAD_SIZE = 200 * 1000 * 1000 SUMMERNOTE_CONFIG = { 'attachment_filesize_limit': UPLOAD_SIZE, 'summernote': { 'width': '100%', 'height': '480', } } 参照: https://stackoverflow.com/questions/74588821/how-to-change-file-upload-size-limit-django-summernote ...
  • Django Summernoteを使ったブログで、本文の画像を記事のサムネイルにするには【BeautifulSoup使用】

    Django-summernoteを使ったブログサイトを作るとき。 ブログの記事の一覧表示にはサムネイルの表示が必要になる。 しかし、記事にサムネイル専用のフィールドを割り当ててしまうと、本文の画像とかぶってしまう(サムネイル用の画像を指定した後、記事にも同じ画像を貼り付けるという二度手間) そこで、記事の一番最初に指定された画像をサムネイルとして使えるよう、モデルメソッドを作った。 BeautifulS ...
  • 【Django】2次元配列をCSVファイルとしてダウロードできるようにする【HttpResponse】

    • 作成日時:
    • 最終更新日時:
    • Categories: サーバーサイド
    • Tags: django
    from django.views import View from django.http import HttpResponse import csv class DownloadView(View): def get(self, request, *args, **kwargs): data = [ [ 10,20,30 ], [ 10,20,30 ], [ 10,20,30 ], ] # レスポンスとして返すCSVファイル名 file_name = 'data.csv' # HttpResponseを使ってCSVのデータを書き込む response = HttpResponse(content_type='text/csv') # ファイル名を指定 response['Content-Disposition'] = f"attachment; filename={file_name}" # HttpResponseにCSVファイルデータを書き込む writer = csv.writer(response) writer.writerows(data) return response download = DownloadView.as_view() HttpResponseはこのようにcsv.writer()の引数に指定することができる。 これにより、配列のデータをそのままCSV ...
  • Djangoでfullcalendar.jsを使いTodoアプリを作る

    fullcalendar.jsを早速実践運用してみた。 まだまだ足りない箇所は有るかもしれないが、ここから徐々に発展させ、ゆくゆくはReactと組み合わせてSPAを作りたいところだ。 詳細はソースコードを見ていただきたい。これまでのDjangoとほとんど変わりはないので、記事内ではfullcalendar.jsの部分だけまとめる。 テンプレート index.html {% load static %} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>To ...