Djangoで個人的にハマった事。その2
個人的な備忘録です。
もっとスマートな書き方やもっと適切な方法があるんだろうなと思うけど、期限間に合わせるために力技使ってるとこもあります^^;
気付いたら適時更新や修正していきたい。
1.カスタムタグ定義
サジェスト機能でhiddenにキー値を、inputTextに値を設定する為にmodels.pyの__str__でキー値と値をパイプ区切りの文字列で返却。
キーを取得するためのカスタムタグと、値を取得するためのカスタムタグを定義。
使用するAppフォルダにtemplatetagsフォルダを作成し、__init__.pyファイルを作成。自作のcustomTag.pyファイルを作成し、このファイル内にカスタムタグを定義する。
###
# 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);
}
}
});
:
:
: