Djangoで個人的にハマった事。その2

個人的な備忘録です。
もっとスマートな書き方やもっと適切な方法があるんだろうなと思うけど、期限間に合わせるために力技使ってるとこもあります^^;
気付いたら適時更新や修正していきたい。

1.カスタムタグ定義
サジェスト機能でhiddenにキー値を、inputTextに値を設定する為にmodels.pyの__str__でキー値と値をパイプ区切りの文字列で返却。
キーを取得するためのカスタムタグと、値を取得するためのカスタムタグを定義。
使用するAppフォルダにtemplatetagsフォルダを作成し、__init__.pyファイルを作成。自作のcustomTag.pyファイルを作成し、このファイル内にカスタムタグを定義する。

画像1

###
# customTag.py
###
from django import template

register = template.Library()

@register.filter
def getXXXXId(value1):
   return value1.split('|')[0] if not isEmpty(value1) else ""

@register.filter
def getYYYYNm(value1):
   return value1.split('|')[1] if not isEmpty(value1) else ""

def isEmpty(value):
   return value is None or len(value) == 0
   
###
# sugestYYYYNm.html
###
{% load customTag %} # ロードする
 :
 :
 :
<input type="hidden" name="{{ widget.name }}" value="{{ widget.value.0|getXXXXId }}" id="{{ widget.name }}-value">
<input type="text" value="{{ widget.value.0|getYYYYNm }}" id="{{ widget.name }}-input" data-target="{{ widget.name }}" autocomplete="off" {% include "django/forms/widgets/attrs.html" %}>

2.検索条件の追加
検索フォームで入力された検索条件を結合させてDBに検索を行う。
Qオブジェクトを用いるけど、今回検索条件がある分だけQオブジェクトを用意した。1つで使い回せないのかな。分からなかったので下記で対応。。。

###
# views.py
###
# 検索
@csrf_protect
def search(request):
   searchForm = SearchForm(request.POST or None)

   # バリデート結果がOKなら抽出する
   if request.method == "POST" and searchForm.is_valid():
       # 検索条件から抽出された結果を取得
       results = searchXXXXX(searchForm)
       
       

def searchXXXXX(searchForm):
   # 検索フォームから値取得
   searchA = searchForm.cleaned_data['searchA']
   searchB = searchForm.cleaned_data['searchB']
   searchC = searchForm.cleaned_data['searchC']
   searchD = searchForm.cleaned_data['searchD']
   searchE = searchForm.cleaned_data['searchE']

   # 検索条件オブジェクト
   condition_A = Q()
   condition_B = Q()
   condition_C = Q()
   condition_D = Q()

   if not isEmpty(searchA):
       condition_A = Q(A__contains=searchA)
       
   if not isEmpty(searchB):
       condition_B = Q(B=searchB)

   if not isEmpty(searchC):
       condition_C = Q(C__contains=searchC)

   if not isEmpty(searchD) and not isEmpty(searchE):
       condition_D = Q(day__range=(searchD.replace('/', ''), searchE.replace('/', '')))

   elif not isEmpty(searchD) and isEmpty(searchE):
       condition_D = Q(day__gte=searchD.replace('/', ''))

   elif isEmpty(searchD) and not isEmpty(searchE):
       condition_D = Q(day__lte=searchE.replace('/', ''))
       
   return T_table.objects.all().filter(condition_A 
                                   & condition_B 
                                   & condition_C 
                                   & condition_D)

3.ajaxでpost送信する際、下記のcsrfのエラーが発生した
 下記の記述を定義し対応。公式ページから引用している。

<script type="text/javascript">
      $(document).ready(function(){
       var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();
       var isAjaxExc = true;
       function csrfSafeMethod(method) {
           // these HTTP methods do not require CSRF protection
           return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
       }
       $.ajaxSetup({
           beforeSend: function(xhr, settings) {
               if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                   xhr.setRequestHeader("X-CSRFToken", csrftoken);
               }
           }
       });  :  :  :

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