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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

Q&A

0回答

321閲覧

Djangoで求人サイトのOR条件の検索システムを構築したい

topy

総合スコア12

Django

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

Python

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

0グッド

0クリップ

投稿2019/02/12 08:05

前提・実現したいこと

Djangoで求人サイトのOR条件の検索システムを構築したいです。

現状は、
求人タイトルや給与、仕事内容などをまとめた「Job」というモデルと、
「未経験」「研修制度あり」などのタグをまとめた「JobTag」というモデルを作成しており、
ManyToManyでリレーションしています。

テンプレートで実現したいこととしては、
タグが6種類あるので、6個のチェックボックスを作成し、
チェックが入ったタグの求人情報を出力したいです。

試したこと

viewのself.request.GET.getlist(’search')を用いて、
チェックが入ったタグをリストで取得し(例:example.com/jobs/search?q=タグ1+タグ2)、
filterメソッド内で、チェックが入ったタグの個数分forでループを回してフィルタリング(検索)しました。
が、チェックを入れて検索ボタンを押しても(パラメータを与えても)、変化がありません。。。

下記が試行錯誤したソースですが、
間違いがあれば教えていただけますと幸いです。

よろしくお願いいたします!

models

1class JobTag(models.Model): 2 JOB_TAG = ( 3 (‘タグ1', 'タグ1'), 4 (‘タグ2', ‘タグ2'), 5 (‘タグ3', ‘タグ3'), 6 (‘タグ4', ‘タグ4'), 7 (‘タグ5', ‘タグ5'), 8 (‘タグ6', ‘タグ6'), 9 ) 10 11 jobTag_tags = models.CharField(verbose_name='求人タグ', max_length=20, choices=JOB_TAG, blank=True) 12 13 def __str__(self): 14 return self.jobTag_tags 15 16class Job(models.Model): 17 job_ttl = models.CharField(verbose_name='求人タイトル', max_length=25, blank=True) 18 job_tag = models.ManyToManyField(JobTag) 19 job_description = models.TextField(verbose_name='仕事内容', max_length=180, blank=True) 20 job_saralyUnder = models.CharField(verbose_name='給与下限', max_length=25, blank=True) 21 job_saralyOver = models.CharField(verbose_name='給与上限', max_length=25, blank=True) 22 job_age = models.CharField(verbose_name='年齢', max_length=15, blank=True) 23 job_benefits = models.TextField(verbose_name='待遇・福利厚生', max_length=100, blank=True) 24 25 def __str__(self): 26 return self.job_ttl 27

views

1from django.db.models import Q 2 3# 求人情報一覧 4class JobListView(generic.ListView): 5 model = Job 6 context_object_name = 'jobs_list' 7 template_name = 'edit/jobs_list.html' 8 paginate_by = 4 9 10 def get_context_data(self, **kwargs): 11 context = super(JobListView, self).get_context_data(**kwargs) 12 13 job_tags = JobTag.objects.all() 14 context['job_tags'] = job_tags 15 16 return context 17 18 def get_queryset(self): 19 search_tags = self.request.GET.getlist('search') 20 for search_tag in search_tags: 21 Job.objects.filter( 22 Q(job_tag=search_tag) 23 ).distinct() 24 25 return search_tag

html

1 <form method="get" action="" name="filter_form"> 2 <legend>絞り込み検索</legend> 3 <div> 4 <span>求人タグ:</span> 5 {% for job in job_tags %} 6 <input type="checkbox" id="filter_job_{{ job.id }}" 7 name="search" 8 value="{{ job.jobTag_tags }}">{{ job.jobTag_tags }} 9 {% endfor %} 10 </div> 11 <div> 12 <button id="filter”>絞り込む!</button> 13 </div> 14 </form> 15 16 <div id="main"> 17 <h1>結果</h1> 18 {% for search_result in search_tag %} 19 <!-- 求人情報のループ --> 20 {% endfor %} 21 </div>

バージョン情報

python(3.7.1)
Django(2.1.2)

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/02/12 20:09

デバッグ環境を構築してみてください。 そして実際に何が取得できていて、フィルタ時にどう動いているのかを確認してください。 その結果、理解できない動作を特定できたら、そこを聞くようにしましょう。 現状だと疑う部分が多くて、長い問答が発生しそうです。
topy

2019/02/12 23:29

>デバッグ環境を構築 これはどのような環境を指していますか? >そして実際に何が取得できていて、フィルタ時にどう動いているのかを確認 これはどのように行うものなのでしょうか?
wwbQzhMkhhgEmhU

2019/02/12 23:52

具体的に言った方がいいですね。選択肢は1つではないと思いますが、私の場合で言うと、Visual Studio Codeでdjangoのデバッグ環境を構築しています。 ブレークポイントを設定しておくと、そこで実行が止まり、ステップ実行しながら、変数がどう設定されているのかをリアルタイムに知ることが出来ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問