自動化無しに生活無し

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

  • 【Django】検索結果(QuerySet)を結合する【.union()】

    クエリビルダでまとめて検索ができない状況下で、検索処理を複数回に分けて実行し、得られたQuerySetを1つにまとめたいとき。 .union() もしくは|が使える。 from django.shortcuts import render,redirect from django.views import View from .models import Topic class IndexView(View): def get(self, request, *args, **kwargs): topics = Topic.objects.all() context = { "topics":topics } # 重複は自動的に除外される topics = topics.union( Topic.objects.all() ) print(topics) first = Topic.objects.filter(id=1) second = Topic.objects.filter(id=2) third = Topic.objects.filter(id=3) # パイプを使用して連結しても良い。 topics = first | second | third return render(request,"bbs/index.html",context) def post(self, request, *args, **kwargs): posted = Topic( comment = request.POST["comment"] ) posted.save() return redirect("bbs:index") index = IndexView.as_view() ...
  • 【Django】JavaScriptのfetchAPIでリクエストを送る

    XMLHttpRequest(XHR)はAjaxの初期のAPIでコードが長くて複雑。jQuery.ajaxは昨今のjQuery離れが深刻。 では、何でリクエスト送信機能を実装すれば良いか。 FetchAPIである。 軽量で簡潔に書ける上に、CORSに対応しており、なおかつインストールは不要。 本記事では、DjangoでFetchAPIを使ってPOSTメソッドのリクエストを送信してみた。 テンプレート {% load static %} ...
  • 【Django】管理サイトで1対多(ForeignKey)、多対多(ManyToManyField)のフォームを扱いやすくする【admin】

    1対多、多対多を管理サイトで扱うには、デフォルトのフォームではとても使いづらい。 そこで、更に管理サイトをカスタムして、フォームを扱いやすくさせる。 モデルは下記記事から引用し、一部編集した。 【Django】ManyToManyFieldで検索をする方法、追加・削除を行う方法【多対多はクエリビルダの検索は通用しない】 【Django】デフォルトの認証機能を網羅し、カスタムユーザーモデルとメール認証も実装 ...
  • 【Django】逆参照のrelated_nameを使用して1側から多側のデータを取り出す【models.ForeignKey()】

    related_nameを指定せずに逆参照をする 逆参照を使うことで、1側から多側のデータを取り出すことができる。 『Djangoで1対多のリレーションを構築する【カテゴリ指定、コメントの返信などに】【ForeignKey】』から引用した下記モデル。 class Category(models.Model): name = models.CharField(verbose_name="カテゴリ名",max_length=20) def __str__(self): return self.name class Topic(models.Model): category = mod ...
  • 【Django】views.pyからurls.pyを自動的に作る【コマンド1発で生成】

    views.pyからurls.pyを作る。 URL引数(パスコンバーター)にも対応させる。 これまでと同様、コードは追記する形式ではあるが、実行は自己責任で。 【Django】models.pyとforms.pyからviews.pyを自動的に作る【コマンド1発で生成】 【Django】models.pyからforms.py及びadmin.pyを自動的に作る【コマンド1発で生成】 注意 Viewを継承したビュー ...
  • 【Django】models.pyとforms.pyからviews.pyを自動的に作る【コマンド1発で生成】

    以前の自動生成ツール 【Django】models.pyからforms.py及びadmin.pyを自動的に作る【コマンド1発で生成】 この続き。今回はviews.pyを自動的に作る。 いつも同じようなものをimportして、ビュークラスを作り、DB操作とレンダリングしているだけなので。 内容は以前のコードをviews.py仕様にしただけで、特別なものは使っていない。 ソースコード import glob, re, sys ## 引数の指定がある場 ...
  • 【Django】カスタムテンプレートタグを実装させずにページネーションと検索を両立させる【Paginator】

    以前のページネーションを実装する方法(他パラメータとの両立)は、実装に手間がかかる。 views.pyでPaginatorのオブジェクトを作り bbs/templatetags/param_change.py を作り ↑をsettings.pyに登録 ↑をテンプレートで呼び出し、カスタムテンプレートタグを実行 たかが、検索とページネーションを両立させるためだけに、3工程も4工程もかかってしまう。 もっとシンプルにできないかと模索し、カスタムテンプレートタグの処理をビューで ...
  • 【Django】各アプリのトップページとアプリ名をまとめてレンダリングする【apps.pyとurls.pyを操作】

    1つのDjangoプロジェクトに複数のアプリを作り、各アプリのリンクをまとめて表示する。 新しいアプリが追加されるたび、そのリンクをテンプレートにて手動で追記しているようではとても手間だ。整合性も取れなくなるだろう。 だから、全てのアプリのトップページのリンクと、アプリ名をまとめて生成。contextに入れ、レンダリングする。 そういう処理を作る。 前提 このコードを実装する前に、以下前提を守る必要がある。 ...
  • 【Django】ログイン時にメールを送信するには、signal.pyを作ってapps.pyに登録しておく【セキュリティ通知】

    セキュリティ対策の一環として、ログイン時にメールを送信させる。 すでにsettings.pyにメール送信設定を実装済みとする。 【メール認証】Django-allauthの実装方法とテンプレート編集【ID認証】 appname/signals.py を作る。 関数にデコレータを当てて、ログインの信号を受けたら発動する。 from django.contrib.auth.signals import user_logged_in, user_logged_out from django.dispatch import receiver from django.conf import settings from django.core.mail import EmailMessage @receiver(user_logged_in) def user_logged_in_callback(sender, request, user, **kwargs): # ログインをしたときの処理 #送信元のIPアドレスを手に入れる ip_list = request.META.get('HTTP_X_FORWARDED_FOR') if ip_list: ip = ip_list.split(',')[0] else: ...
  • 【Django】デフォルトの認証機能を網羅し、カスタムユーザーモデルとメール認証も実装させる【脱allauth】

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