質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

276閲覧

Django のfilterで、本文の一部を表示させる方法

hiroikawa55

総合スコア26

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/04/15 03:49

Djangoで、名称(name)と本文(text)からなるデータベースに、
フィルターで、本文の一部のみを表示させたいと取り組んでいます。
ベースとなる形は、Django REST Frameworkを使って爆速でAPIを実装するを参考にしています。

○実現したいこと
最初に、たとえば「壇」を含む本文について、下記のように抽出し、

名称(name)本文(text)
護摩壇護摩をたく炉を据える壇。 大型、円形、木製の3種がある。
須弥壇仏教寺院において本尊を安置する壇。仏像等を安置するために一段高く設けられた場所のこと。須弥山に由来する。
神棚家や事務所などにおいて主に神道の神をまつるための祭壇である。神棚には3種類ある。

次に、「壇」の字を含む、「。」で区切られた文のみを表示する。※見え消しとした部分は表示しない。

名称(name)本文(text)
護摩壇護摩をたく炉を据える壇。 大型、円形、木製の3種がある。
須弥壇仏教寺院において本尊を安置する壇。仏像等を安置するために一段高く設けられた場所のこと。須弥山に由来する。
神棚家や事務所などにおいて主に神道の神をまつるための祭壇である。神棚には3種類ある。

○方法
①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>

どうぞよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

②テンプレートタグを作成し、関数'filterage'を定義する。

テンプレートフィルタですね。

テンプレートフィルタは、下記のように使用します。

html

1{{ item.content|filter_age:c_form }}

なお、

  1. postかつform.is_valid()が成立する場合、c_formには、入力され検証済みのfindの値が設定されます。
  2. postかつform.is_valid()が成立しない場合、c_formは未定義になります。
  3. getの場合、c_formにはFindFormインスタンスが設定されます。

2の場合はparams辞書を構築している箇所でエラーが発生すると思われます。
3の場合は、テンプレートフィルタが正常に動作しないと思われます。

投稿2020/04/15 05:33

編集2020/04/15 05:34
hasami

総合スコア1277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroikawa55

2020/04/15 06:21

動きました! エラーの意味が理解できました。 2ヶ月間苦闘し続けて、ようやく形がつくれました。諦めずに続けてよかったです(本当に泣きそうです、ありがとうございました!!)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問