自動化無しに生活無し

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

  • 【Django】sympyで計算した結果をLatex記法でHTML上に出力、mathjaxを使って数式を表示

    Pythonには高度な計算を行う事ができるライブラリが充実している。 それを、端末を問わずに利用できるようにするには、Pythonをウェブアプリとして動作させる必要がある。つまり、Djangoを使うことになる。 だが、指数や対数、平方根などを、通常の文字列だけでHTML上に表現するには限界がある。 そこで、Latexの文字列を数式として表現できるmathjaxを使うことにした。 Djangoはいつもの40 ...
  • 【Django】モデルを使用したフォームクラスで、required属性を付与する

    モデルを使用したフォームクラスは、モデルの制約に依存する。 そのため、モデルの制約がゆるくても、フォームクラスで引き締めたい場合、別途対策が必要になる。 フォームクラスにrequired属性を付与する class TopicCategoryForm(forms.ModelForm): class Meta: model = Topic fields = [ "category" ] #TODO:categoryの入力を必須化させる def __init__(self, *args, **kwargs): super(TopicCategoryForm, self).__init__(*args, **kwargs) self.fields['category'].required = True コンストラクタをオーバーライドすれば良いそうだ。 参照元: https://stackoverflow.com/questions/44810064/form-required-field-in-django-model-forms ...
  • DjangoでPythonライブラリのマークダウンを試してみる【pip install Markdown】

    どうやらPythonライブラリにマークダウンを実現させるライブラリがあるそうだ。これがDjangoで扱えるらしい。 かなり前から、どうにかしてDjangoでマークダウンを実現できないかと考えていたが、ようやく見つかって良かった。 さっそく試してみる。 インストール pip install Markdown バージョンはこうなった。 importlib-metadata==5.0.0 Markdown==3.4.1 zipp==3.9.0 動かすとこうなる このマークダウンを読み込み、HTMLに変換してもらう。 ## Pythonの構文 ``` for i in range(6): print(i) print("hello") print("hello") ...
  • 【Django】ManyToManyFieldにはフィールドオプションvalidatorsは効果なしなので、フォームクラスに追加のバリデーションを【多対多は特殊】

    • 作成日時:
    • 最終更新日時:
    • Categories: サーバーサイド
    • Tags: django
    ManyToManyFieldにはvalidatorsフィールドオプションは通用しない。 そのため、モデル側から何らかの制約を課すことはできない。 だから、フォームクラスに追加のバリデーションを書き込む。 今回はManyToManyFieldのタグを2個までとするバリデーションを追加する。 モデル from django.db import models from django.conf import settings from django.utils import timezone class Tag(models.Model): name = models.CharField(verbose_name="タグ名 ...
  • 【Django】ManyToManyFieldで検索をする方法、追加・削除を行う方法【多対多はクエリビルダの検索は通用しない】

    • 作成日時:
    • 最終更新日時:
    • Categories: サーバーサイド
    • Tags: django
    背景 TopicとTagの多対多のリレーションを組んだ状況で。 # この場合、1を含んでいるという意味になる data = Topic.objects.filter(tag=1) print(data) # この場合、1もしくは3を含むデータが手に入るが、重複する。.distinct() で除外できる。 # しかし1だけ、3だけのデータも取得できてしまう。ほしいのは1と3を含むデータ data = Topic.objects.filter(tag__in=[1,3]).distinct() print(data) 複数のタグ検索が正常に機能してくれない状況にある。(1だけ、3だけではなく、1と3を含んだデータのみがほしい ...
  • 【Django】Django4.0以上はsettings.pyにて、CSRF_TRUSTED_ORIGINSにオリジンを指定しないとPOSTリクエスト時に403Forbiddenになる

    背景 下記記事に倣って、EC2に独自ドメインを指定して、デプロイを完了させた。 【AWS】EC2にムームドメインで取得した独自ドメインを割り当て、HTTPS通信を行う【Route 53 + Certificate Manager + ロードバランサ(ELB)】 その後、POSTメソッドのリクエストを送信する際、どう頑張ってもCSRF検証に失敗したというエラーが出てしまう。 CSRF Failed: Referer checking failed - https://*********************.com does not match any trusted origins. これはなぜか。どう対策をすれば良いのかをまとめてみた ...
  • 【Django】パスコンバータ(URLに含まれた引数)を使って個別ページを表示させる

    40分Djangoを終えた方向け。 投稿したTopicの編集や削除、Topicに対してコメントの投稿をする時、予め個別ページを作っておく必要がある。 本記事ではパスコンバータを使って個別ページの作り方を解説する パスコンバータの仕組み Djangoにおいて、urls.pyにて定めた<型:引数名>は実行するビューにて呼び出しができるようになっている。 bbs/urls.py まず、bbsアプリ内のurls.pyにて、こ ...
  • Djangoでクエリビルダを使い、スペース区切りの文字列検索と絞り込みを同時に行う【JSとカスタムテンプレートタグを使用】

    • 作成日時:
    • 最終更新日時:
    • Categories: サーバーサイド
    • Tags: Django
    カスタムテンプレートタグはJavaScriptにとって変えることもできるが、今回はあらゆる状況を考慮し、両方使用した。 ビュー from django.shortcuts import render from django.views import View from django.db.models import Q from .models import Category,Product from .forms import CategorySearchForm,ProductMaxPriceForm,ProductMinPriceForm class IndexView(View): def get(self, request, *args, **kwargs): context = {} query = Q() context["categories"] = Category.objects.order_by("-dt") #検索キーワードあり if "search" in request.GET: search = request.GET["search"] raw_words = search.replace(" "," ").split(" ") words = [ w for w in raw_words if w != "" ] for w in words: query &= Q(name__contains=w) #カテゴリ検索ありの時、queryに追加する。 form = CategorySearchForm(request.GET) if form.is_valid(): cleaned = form.clean() query &= Q(category=cleaned["category"]) #金額の上限 form = ProductMaxPriceForm(request.GET) if form.is_valid(): cleaned = form.clean() query &= Q(price__lte=cleaned["max_price"]) #金額の下限 form = ...
  • 【VanillaJS】Djangoで素のJavaScriptのXMLHttpRequest(Ajax)を使ってリクエストを送信【jQuery不使用】

    POSTメソッドを送信する 前項で取得したCSRFトークンをリクエストヘッダにセットして送信する。 window.addEventListener("load" , () => { const submit = document.querySelector("#submit"); submit.addEventListener( "click", () => { send(); }); }); const send = () => { const form_elem = "#form_area"; const form = document.querySelector(form_elem); const data = new FormData( form ); const url = form.getAttribute("action"); const method = form.getAttribute("method"); // formタグ内のデータを確認。 for (let v of data ){ console.log(v); } const request = new XMLHttpRequest(); //送信先とメソッドの指定 request.open(method,url); // formタグ内にcsrf_tokenが含まれているため不要。 //console.log(csrftoken); //request.setRequestHeader("X-CSRFToken", csrftoken); //送信(内容) request.send(data); //成功時の処理 request.onreadystatechange = () => { if( request.readyState === 4 && request.status === ...
  • 【Django】django-admin、python、pip、コマンドが動作しない場合の対処法【環境構築問題】

    いわゆる、PATHが通っていない状態 Pythonのインストーラーでインストールする時、『add Python 3.x to PATH』というチェック項目がある。 そこにチェックを入れることで、pythonコマンドが使えるようになる。 参照元:https://bluebirdofoz.hatenablog.com/entry/2019/01/19/141007 django-adminコマンドが使えない時、 django-admin startproject config . pythonか ...