前提・実現したいこと
Djangoで写真投稿サイトを開発しています。サイト内検索の結果一覧にて検索条件を維持したままページング処理を行いたいのですが正しく動作しません。初心者の為素人臭いコードかとは思いますがご教示願いたく存じます。
発生している問題・エラーメッセージ
サイト内検索フォームを実装して問題なく検索ができており、検索結果一覧のページング処理にて1ページ目は結果もページネーションとページ数なども正しく表示されています。しかし検索結果を維持したままで2ページ目に移動できるようにテンプレートタグを使ってやってみたのですが、結果一覧もページネーションも何も表示されません。しかしブラウザ上のURLではちゃんとp=2となっているので2ページ目には移動しているようなのです。エラーメッセージは出ていません。
※templatetagsフォルダは開発中のapp内のviewsなどと同じ階層に作りました。中に空の__init__.pyを作成しました。
※他のページ(indexなど)でのページングは正しく動作しています。
該当のソースコード
(views.py) def search(request): photo_list = Photo.objects.all().order_by('date_field') paginator = Paginator(photo_list, 2) p = request.GET.get('p') photos_page_search = paginator.get_page(p) formset = PhotoSearchFormSet(request.POST or None) if request.method == 'POST': formset.is_valid() queries = [] for form in formset: q_kwargs = {} title = form.cleaned_data.get('title') if title: q_kwargs['title__icontains'] = title text = 'タイトルで検索: %s ' %(title) messages.info(request, text) #↑と同じ検索部分は省略しています# if q_kwargs: q = Q(**q_kwargs) queries.append(q) if queries: base_query = queries.pop() for query in queries: base_query |= query photo_list = photo_list.filter(base_query).order_by('date_field') paginator = Paginator(photo_list, 2) p = request.GET.get('p') photos_page_search = paginator.get_page(p) context = { 'photos_page_search': photos_page_search, 'formset' : formset } return render(request, 'photo/photo_search.html', context)
(photo_search.html) {% extends 'photo/base.html' %} {% load search_page %} {% block content %} <div> <button type="submit" class="btn btn-warning"><a href="{% url 'photo:index' %}"><i class="fa fa-angle-double-left" aria-hidden="true"></i>HOME</a></button> </div> <div class="searchcontainer"> <div class="header"> <i class="fa fa-search" aria-hidden="true"></i>条件検索 </div> <form id= "searchbox" action="{% url 'photo:search_photo' %}" method="POST"> {{ formset.management_form }} {% for form in formset %} <div class="search_box"> <label>タイトル:</label> {{ form.title }} #省略# </div> {% endfor %} {% csrf_token %} <div class="form-group text-right" style="padding:20px 0"> <input id="clearbtn" class="btn btn-danger" type="reset" name="reset" value="条件をクリア" ><button type="submit" class="btn btn-primary">検索</button></a> </div> </form> </div> {% if formset.is_valid %} <div class="photo-container"> {% for photo in photos_page_search %} <div class="photo"> <a href="{% url 'photo:photos_detail' photo.id %}"> <img src="{{ photo.image.url }}" class="photo-img"> </a> <div class="photo-info"> <h2>{{ photo.title }}</h2> <p>{{ photo.date_field }}</p> <a href="{% url 'photo:photos_category' category=photo.category %}" class="category">{{ photo.category }}</a> <a href="{% url 'photo:users_detail' photo.user.id %}">@{{ photo.user }}</a> </div> </div> {% endfor %} </div> <ul class="pagination"> <!-- 前のページへのリンク --> {% if photos_page_search.has_previous %} <li class="page-item"> <a class="page-link" href="?{% url_replace request 'p' photos_page_search.previous_page_number %}"> <span aria-hidden="true">«</span> </a> </li> {% endif %} <!-- 現在のページ番号と全体のページ数 --> {% for num in photos_page_search.paginator.page_range %} {% if photos_page_search.number == num %} <li class="page-item active"><a class="page-link" href="#!">{{ num }}</a></li> {% else %} <li class="page-item"><a class="page-link" href="?{% url_replace request 'p' num %}">{{ num }}</a></li> {% endif %} {% endfor %} <!-- 次のページへのリンク --> {% if photos_page_search.has_next %} <li class="page-item"> <a class="page-link" href="?{% url_replace request 'p' photos_page_search.next_page_number %}"> <span aria-hidden="true">»</span> </a> </li> {% endif %} </ul> {% endif %} {% endblock %}
(templatetags/search_page.py) from django import template register = template.Library() @register.simple_tag def url_replace(request, field, value): url_dict = request.GET.copy() url_dict[field] = str(value) return url_dict.urlencode()
試したこと
tenplatetagsフォルダ内のsearch_pageのコードも、
viewsの
photo_list = Photo.objects.all().order_by('date_field')
paginator = Paginator(photo_list, 2)
p = request.GET.get('p')
の部分もどこを触っても検索ができなくなったりエラーが出たりと不具合が生じますがこれら以外に原因が思い当たりません。
テンプレートタグ作成後はサーバーを再起動しています。
アドバイスいただけたらと思います…。よろしくお願いします。
あなたの回答
tips
プレビュー