Djangoで、データベースの①テキストを検索し(Filterをかける)、②抽出されたテキストについて、さらに③検索語の含まれる文('。'で区切られた、検索語の含まれる文)を示す方法を探しています。
○動作の例
①検索(フィルター):「蛍」
テキストを抽出「春はあけぼの。やうやう白くなりゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。夏は夜。月のころはさらなり、闇もなほ、蛍の多く飛びちがひたる。また、ただ一つ二つなど、ほのかにうち光て行くもをかし。雨など降るもをかし。」
③検索語の含まれる文を示す「月のころはさらなり、闇もなほ、蛍の多く飛びちがひたる。」
Templateタグを利用して、下記のようなプログラムをつくりました。
ただ、item_filter.htmlで検索語を関数(filter_age)に渡そうとしても、検索語が特定できずに足踏みをしています。
"filter"
form
等、片っ端から試してみたのですが、うまくいっていません(下のプログラムでは"filter"を入れていますが、動かしても検索語が含まれる文を表示するところまでは至っていません。
下記のページを読んでも、方法がわからず、お伺いする次第です。どうぞよろしくお願いいたします。
https://docs.djangoproject.com/en/2.0/howto/custom-template-tags/
python
1#templatetags/item_extras.py 2from django import template 3from django.template.defaultfilters import stringfilter 4register = template.Library() 5 6@register.filter 7@stringfilter 8def filter_age(value1, value2): 9 s = value1 10 f = '\n'.join(s.splitlines()) 11 s_l = f.split('。') 12 word = value2 13 for i in s_l: 14 if word in i: 15 return i
python
1{% extends "./_base.html" %} 2{% block content %} 3{% load crispy_forms_tags %} 4<div class="container"> 5 <div id="myModal" class="modal fade" tabindex="-1" role="dialog"> 6 <div class="modal-dialog" role="document"> 7 <div class="modal-content"> 8 <div class="modal-header"> 9 <h5 class="modal-title">検索条件</h5> 10 <button type="button" class="close" data-dismiss="modal" aria-label="閉じる"> 11 <span aria-hidden="true">×</span> 12 </button> 13 </div> 14 <form id="filter" method="get"> 15 <div class="modal-body"> 16 {{filter.form|crispy}} 17 </div> 18 </form> 19 <div class="modal-footer"> 20 <a class="btn btn-outline-secondary" data-dismiss="modal">戻る</a> 21 <button type="submit" class="btn btn-outline-secondary" form="filter">検索</button> 22 </div> 23 </div> 24 </div> 25 </div> 26 <div class="row"> 27 <div class="col-12"> 28 <a class="btn btn-secondary filtered" style="visibility:hidden" href="/?page=1">検索を解除</a> 29 <div class="float-right"> 30 <a class="btn btn-outline-secondary" href="{% url 'create' %}">新規</a> 31 <a class="btn btn-outline-secondary" data-toggle="modal" data-target="#myModal" href="#">検索</a> 32 </div> 33 </div> 34 </div> 35 36 <div class="row" > 37 <div class="col-12"> 38 {% include "./_pagination.html" %} 39 </div> 40 </div> 41 <div class="row"> 42 <ul class="list-group"> 43 {% for item in item_list %} 44 <li class="list-group-item"> 45 <div class="row"> 46 <div class="col-3"> 47 <p>名称</p> 48 </div> 49 <div class="col-9"> 50 <p>{{ item.name }}</p> 51 </div> 52 </div> 53 <div class="row"> 54 <div class="col-3"> 55 <p>文</p> 56 </div> 57 <div class="col-9"> 58 {% load item_extras %} 59 <p>{{ item.age | filter_age:"filter" }}</p> 60 </div> 61 </div> 62 <div class="row"> 63 <div class="col-12"> 64 <div class="float-right"> 65 <a class="btn btn-outline-secondary " href="{% url 'detail' item.pk %}">詳細</a> 66 <a class="btn btn-outline-secondary " href="{% url 'update' item.pk %}">編集</a> 67 <a class="btn btn-outline-secondary " href="{% url 'delete' item.pk %}">削除</a> 68 </div> 69 </div> 70 </div> 71 </li> 72 {% empty %} 73 <li class="list-group-item"> 74 対象のデータがありません 75 </li> 76 {% endfor %} 77 </ul> 78 </div> 79 </div> 80 <div class="row" > 81 <div class="col-12"> 82 <div class="float-right"> 83 <a class="btn btn-outline-secondary" href="{% url 'create' %}">新規</a> 84 <a class="btn btn-outline-secondary" data-toggle="modal" data-target="#myModal" href="#">検索</a> 85 </div> 86 </div> 87 </div> 88</div> 89{% endblock %}
python
1from django.contrib.auth.mixins import LoginRequiredMixin 2from django.urls import reverse_lazy 3from django.views.generic import DetailView 4from django.views.generic.edit import CreateView, UpdateView, DeleteView 5from django_filters.views import FilterView 6 7from .filters import ItemFilter 8from .forms import ItemForm 9from .models import Item 10 11# Create your views here. 12# 検索一覧画面 13class ItemFilterView(LoginRequiredMixin, FilterView): 14 model = Item 15 16 # django-filter用設定 17 filterset_class = ItemFilter 18 strict = False 19 20 # 1ページあたりの表示件数 21 paginate_by = 10 22 23 # 検索条件をセッションに保存する 24 def get(self, request, **kwargs): 25 if request.GET: 26 request.session['query'] = request.GET 27 else: 28 request.GET = request.GET.copy() 29 if 'query' in request.session.keys(): 30 for key in request.session['query'].keys(): 31 request.GET[key] = request.session['query'][key] 32 33 return super().get(request, **kwargs) 34 35 36# 詳細画面 37class ItemDetailView(LoginRequiredMixin, DetailView): 38 model = Item 39 40 41# 登録画面 42class ItemCreateView(LoginRequiredMixin, CreateView): 43 model = Item 44 form_class = ItemForm 45 success_url = reverse_lazy('index') 46 47 48# 更新画面 49class ItemUpdateView(LoginRequiredMixin, UpdateView): 50 model = Item 51 form_class = ItemForm 52 success_url = reverse_lazy('index') 53 54 55# 削除画面 56class ItemDeleteView(LoginRequiredMixin, DeleteView): 57 model = Item 58 success_url = reverse_lazy('index') 59
html
1{% extends "./_base.html" %} 2{% load crispy_forms_tags %} 3{% block content %} 4{{ form.certifications.errors }} 5<div class="container"> 6 <div class="row"> 7 <div class="col-12"> 8 <h2 class="text-center">データ入力</h2> 9 </div> 10 </div> 11 <div class="row"> 12 <div class="col-12"> 13 <div class="float-right"> 14 <a class="btn btn-outline-secondary" href="{% url 'index' %}">戻る</a> 15 <a class="btn btn-outline-secondary save" href="#">保存</a> 16 </div> 17 </div> 18 </div> 19 <div class="row"> 20 <div class="col-12"> 21 <form method="post" id="myform"> 22 {%crispy form%} 23 </form> 24 </div> 25 </div> 26 <div class="row"> 27 <div class="col-12"> 28 <div class="float-right"> 29 <a class="btn btn-outline-secondary" href="{% url 'index' %}">戻る</a> 30 <a class="btn btn-outline-secondary save" href="#">保存</a> 31 </div> 32 </div> 33 </div> 34</div> 35{% endblock %}
回答2件
あなたの回答
tips
プレビュー