Django製検索エンジンで困りました。

420 views
Skip to first unread message

Kazumin Kazumin

unread,
Jun 19, 2015, 5:07:20 AM6/19/15
to djan...@googlegroups.com
初めまして。
私、とある国立大学2年次Kinoshita Kazumiともうします。

Djangoで簡易検索エンジンを実装していて、どうしてもわからないことがあるので、
投稿しました。

二つのフォームがある検索エンジンを実装しています。

空のフォームの状態で、送信されてると、データベースを全て表示してしまうので、
request.POST["kamoku"]がもしからなら、データベース検索をするように実装したいです。

なので、下記のように実装したのですが、全て表示されてしまいます。

どのように書けばよろしいでしょうか?

viewの中
<pre>
def search(request):
 #postで受け取る
    kamoku = request.POST["kamoku"]
    gakunen = request.POST["gakunen"]

#空フォームなのかの判断
    if not " " in kamoku:
        kamoku_look = Item.objects.filter(item_department__contains=kamoku)
    if not " " in gakunen:
        gakunen_look = Item.objects.filter(item_year__contains=gakunen)
 

    h = Context({"kamoku_look":kamoku_look,"gakunen_look":gakunen_look,"kamoku":kamoku})

    return render_to_response("search_item.html",h,context_instance=RequestContext(request))
</pre>

Hiroki Kiyohara

unread,
Jun 19, 2015, 6:04:42 AM6/19/15
to djan...@googlegroups.com

はじめまして、清原です。

ユーザーの入力を扱うのであればformを使うのはどうでしょう?
「必須入力」のような処理を簡単に作れます https://docs.djangoproject.com/en/1.8/topics/forms/

2015/06/19 18:07 "Kazumin Kazumin" <e14...@ie.u-ryukyu.ac.jp>:
--
--
----------------- http://djangoproject.jp/ -----------------
You received this message because you are subscribed to the Google Groups "django-ja" group.
To post to this group, send email to djan...@googlegroups.com
To unsubscribe from this group, send email to django-ja-...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/django-ja
---
このメールは Google グループのグループ「django-ja」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには django-ja+...@googlegroups.com にメールを送信してください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Yasushi Masuda

unread,
Jun 19, 2015, 10:43:52 AM6/19/15
to djan...@googlegroups.com
Kazuminさん

「if not " " in kamoku」では、kamoku の入力内容が空だったかどうかは判定できません。
入力内容が空のときは、 request.POST["kamoku"] の値は空文字列です。

空文字列というのは、スペースが入った " " ではなくて、中身のない文字列、 "" です。

if len(kamoku) とか、 if kamoku とか、 if bool(kamoku) とか、式を見なおしてみましょう。


2015年6月19日 17:59 Kazumin Kazumin <e14...@ie.u-ryukyu.ac.jp>:
> --
> --
> ----------------- http://djangoproject.jp/ -----------------
> You received this message because you are subscribed to the Google Groups
> "django-ja" group.
> To post to this group, send email to djan...@googlegroups.com
> To unsubscribe from this group, send email to
> django-ja-...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/django-ja
> ---
> このメールは Google グループのグループ「django-ja」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには django-ja+...@googlegroups.com
> にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
Yasushi Masuda PhD
http://whosaysni.jp/
whosaysni at twitter/gmail

yus...@jbking.org

unread,
Jun 20, 2015, 9:54:39 PM6/20/15
to djan...@googlegroups.com
村岡@jbkingです。

それぞれのフォームで対象の検索条件が送られてこなかったらQuerySet.none()をセットするようにしたらどうでしょう。

if フォームの対象検索条件がある:
    xxx_look = Item.objects.filter(検索条件)
else:
    xxx_look = Item.objects.none()

あとPythonの話ですが、 not xxx in yyy は xxx not in yyy と書いたほうがよいですよ。

2015年6月19日金曜日 18時07分20秒 UTC+9 Kazumin Kazumin:

Kazumin Kazumin

unread,
Jun 20, 2015, 9:54:39 PM6/20/15
to djan...@googlegroups.com

Yasushi Masuda さん、 Hiroki Kiyoharaさん。
ご返事ありがとうございます。

not " " in kamoku:式がおかしかったです。

何も入力されなかった場合、request.POST["gakunen"]は、空のunicode、つまりu''を返すようです。
なので
if kamoku is not u'':で解決しました。

ありがとうございました。

Kazumin Kazumin

unread,
Jun 20, 2015, 9:54:39 PM6/20/15
to djan...@googlegroups.com
返信ありがとうございます。

>ユーザーの入力を扱うのであればformを使うのはどうでしょう?
htmlエレメントですか?それならこのような感じです。

<pre>
<form method="post" action="create_user">{% csrf_token %}
    学年: <input type="text" name="gakunen" />
    学部: <input type="text" name="gakunen" />
    <input type="submit" value="検索" />
  </form>
</pre>


入力必須にすると、該当しない部分には入力できない人が出てきてしまうので、できません。

他に、何かないでしょうか?

2015年6月19日金曜日 19時04分42秒 UTC+9 Hiroki Kiyohara:

Yasushi Masuda

unread,
Jun 21, 2015, 12:18:07 AM6/21/15
to djan...@googlegroups.com
Kazuminさん

解決してよかったです。。。が、
is not は使わないようにお勧めします。

is は、値が同じかどうかではなく、メモリ上の同じデータであるかどうかの比較だからです。

例えば、お使いのPythonによっては、こういうことが起こります。

>>> s = list()
>>> s
[]
>>> s == []
True
>>> s is []
False

最初にlist() で作ったリストと、後でリテラルで作ったリストは、値が同じ(中身が空)だが、別のデータだからです。

特殊な事情がない限り、is とか is not を安心して使えるのは、右辺の値が None の時ぐらいです。

Yasushi Masuda

2015/06/20 14:58、Kazumin Kazumin <e14...@ie.u-ryukyu.ac.jp> のメッセージ:

tokibito

unread,
Jun 23, 2015, 10:39:44 PM6/23/15
to djan...@googlegroups.com
岡野です。

参考になるかわかりませんが、以下は検索の実装例です。

### forms.py ###
from django import forms

class SearchForm(forms.Form):
    """検索フォーム
    """
    kamoku = forms.CharField(max_length=100, required=False)
    gakunen = forms.PositiveSmallIntegerField(required=False)


### views.py ###
# importは省略してます
from django.shortcuts import render


def search_items(kamoku=None, gakunen=None):
    """Itemモデルの検索クエリを返します
    """
    filter_params = {}
    if kamoku:
        filter_params['item_department__contains'] = kamoku
    if gakunen:
        filter_params['item_year__contains'] = gakunen
    return Item.objects.filter(**filter_params)


def search(request):
    form = SearchForm(request.GET)  # ここではGETを使ってますが、仕様によってはPOSTでもいいかもしれません
    if form.is_valid():
        items = search_items(
            kamoku=forms.cleaned_data['kamoku']
            gakunen=forms.cleaned_data['gakunen'])
    else:
        items = []

    return render(request, "search_item.html", {'form': form, 'items': items})



2015年6月19日金曜日 18時07分20秒 UTC+9 Kazumin Kazumin:
初めまして。
Reply all
Reply to author
Forward
0 new messages