Djangoで、名称(name)と本文(text)からなるデータベースに、
フィルターで、本文の一部のみを表示させたいと取り組んでいます。
ベースとなる形は、Django REST Frameworkを使って爆速でAPIを実装するを参考にしています。
○実現したいこと
最初に、たとえば「壇」を含む本文について、下記のように抽出し、
名称(name) | 本文(text) |
---|---|
護摩壇 | 護摩をたく炉を据える壇。 大型、円形、木製の3種がある。 |
須弥壇 | 仏教寺院において本尊を安置する壇。仏像等を安置するために一段高く設けられた場所のこと。須弥山に由来する。 |
神棚 | 家や事務所などにおいて主に神道の神をまつるための祭壇である。神棚には3種類ある。 |
次に、「壇」の字を含む、「。」で区切られた文のみを表示する。※見え消しとした部分は表示しない。
名称(name) | 本文(text) |
---|---|
護摩壇 | 護摩をたく炉を据える壇。 |
須弥壇 | 仏教寺院において本尊を安置する壇。 |
神棚 | 家や事務所などにおいて主に神道の神をまつるための祭壇である。 |
○方法
①views.py でfind関数を定義し、入力されたフォーム'form'を'cleaned_data'をつないで'c_form'とする
②テンプレートタグを作成し、関数'filterage'を定義する。
関数'filterage'は、value1として与えられたテキストを句読点'。'でsplitし、value2を含む文のみを返す。
③テンプレート(find.html)上で、テンプレートタグ(filterage)を読み出し、
value1として本文(item.content)を与え、value2に入力されたフォーム(c_form)を与える。
①、②、③のコードは最後に示します。
○うまくいかないところ
テンプレートタグ上で、{{c_form}}を与えると、
filter_age requires 2 arguments, 1 provided
というエラーが出てしまう。
テンプレートタグ上で、変数を入れ子にしたのが問題なのかと思い、
html上で変数を定義する方法を探しているのですが、よい方法がみつかりません。
(CSSやjavascriptを使う方法も試してみたのですが、うまく動きませんでした)
参考:
①テンプレートタグやフィルタを自作する(リンク先は参考にしたdjangoの公式ドキュメントです)
②Python Django 超入門(書籍)
python
1#①views.py 2def find(request): 3 if (request.method == 'POST'): 4 msg = 'search result:' 5 form = FindForm(request.POST) 6 if form.is_valid(): 7 c_form = form.cleaned_data['find'] 8 str = request.POST['find'] 9 data = BoardModel.objects.filter(content__contains=str) 10 else: 11 msg = 'search words...' 12 form = FindForm() 13 c_form = FindForm() 14 data = BoardModel.objects.all() 15 params = { 16 'title': 'Hello', 17 'message': msg, 18 'form':form, 19 'data':data, 20 'c_form':c_form 21 } 22 return render(request, 'find.html', params)
python
1#②テンプレートタグ templatetags.item_extras.py 2from django import template 3from django.template.defaultfilters import stringfilter 4from boardapp.forms import FindForm 5 6register = template.Library() 7@register.filter 8@stringfilter 9def filter_age(value1, value2): 10 s = value1 11 f = '\n'.join(s.splitlines()) 12 s_l = f.split('。') 13 word = value2 14 for i in s_l: 15 if word in i: 16 return i
html
1#find.html 2{% load static %} 3<!doctype html> 4<html lang="ja"> 5<head> 6 <meta charset="utf-8"> 7 <title>{{title}}</title> 8 <link rel="stylesheet" type="text/css" 9 href="{% static 'hello/css/style.css' %}" /> 10</head> 11</html> 12<body> 13 <h1>{{ title }}</h1> 14 <p>{{ content }}</p> 15 <table> 16 <form action="{% url 'find' %}" method="post"> 17 {% csrf_token %} 18 {{ form }} 19 <tr><th></th><td><input type="submit" value="click"></td></tr> 20 </form> 21 </table> 22 <hr> 23 <table> 24 <tr> 25 <th>{{ c_form }}</th> 26 <tr> 27 {% for item in data %} 28 </tr> 29 {% load item_extras %} 30 <td>{{ item.content|filter_age:{{ c_form }}}}</td> 31# {{ c_form }}のところが動かず、よい解決策を探しています。 32 </tr> 33 {% endfor %} 34 </table> 35</body> 36</html>
どうぞよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/15 06:21