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

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

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

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Python

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

Q&A

0回答

2028閲覧

Djangoにてサイト内検索結果一覧のページング処理で検索結果が維持できず正しく表示されません。

AZ_AZ

総合スコア4

Django

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

ページネーション

Webアプリケーションにおいて、1ページに収まらないコンテンツを、各ページへのリンクを並べてアクセスしやすくする手法をページネーションと呼びます。

Python

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

0グッド

0クリップ

投稿2019/08/21 21:50

前提・実現したいこと

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">&laquo;</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">&raquo;</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')
の部分もどこを触っても検索ができなくなったりエラーが出たりと不具合が生じますがこれら以外に原因が思い当たりません。

テンプレートタグ作成後はサーバーを再起動しています。

アドバイスいただけたらと思います…。よろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問