diff --git a/main/tests/test_views.py b/main/tests/test_views.py index 6771cd5e..67bf1ea8 100644 --- a/main/tests/test_views.py +++ b/main/tests/test_views.py @@ -23,6 +23,13 @@ def test_get(self): resp = self.client.get(resolve_url(f'{APP_NAME}:search')) self.assertEqual(200, resp.status_code) + def test_get_with_too_long_query(self): + resp = self.client.get(resolve_url(f'{APP_NAME}:search'), {'q': 'a' * 101}) + self.assertEqual(200, resp.status_code) + self.assertTrue(resp.context['is_blank']) + self.assertEqual('', resp.context['q']) + self.assertEqual([], resp.context['items']) + class LevelSelectTests(TestCase): def test_get(self): diff --git a/main/views/search.py b/main/views/search.py index fc88f681..29241bf2 100644 --- a/main/views/search.py +++ b/main/views/search.py @@ -8,31 +8,25 @@ def search(request: HttpRequest) -> HttpResponse: """ 検索結果 """ - def search_items(q: str = None) -> list[Music]: - filter_params = {} - if q: - # 大文字小文字区別無しの部分一致 - filter_params['title__icontains'] = q - return Music.objects.filter(**filter_params).order_by('level', '-sran_level', 'title') - search_form = SearchForm(request.GET) if search_form.is_valid(): q = search_form.cleaned_data['q'] - if q: - is_blank = False - items = search_items(q=q) - else: - is_blank = True - items = [] else: - is_blank = True + # 無効な入力は空検索と同じ扱いにする (入力値も再描画しない) + search_form = SearchForm() + q = '' + + if q: + # 大文字小文字区別無しの部分一致 + items = Music.objects.filter(title__icontains=q).order_by('level', '-sran_level', 'title') + else: items = [] context = { - 'title': '{q} の検索結果'.format(q=q) if not is_blank else '楽曲検索', + 'title': '{q} の検索結果'.format(q=q) if q else '楽曲検索', 'search_form': search_form, 'q': q, 'items': items, - 'is_blank': is_blank + 'is_blank': not q } return render(request, 'main/search.html', context)