前提・実現したいこと
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)
あなたの回答
tips
プレビュー