🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

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

ページネーション

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

検索

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

Python

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

Q&A

解決済

1回答

3800閲覧

検索結果がページ移動すると保持されなくなる。

reol-777

総合スコア14

Django

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

ページネーション

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

検索

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

Python

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

0グッド

0クリップ

投稿2021/01/01 05:46

編集2021/01/08 13:14

下の画像のように、絞り込み検索で、「優先度」をhighにするとタスクの優先度が高いもの(タスクの周りが赤い)のみが表示されるようになるのですが
![イメージ説明
イメージ説明

ページ移動すると、下の画像のように、検索結果が保持されず元の2ページ目が表示されてしまいます。(ページの数が増えているので、全件検索になっている。)これは、それぞれのページのurlを見ても明らかです

イメージ説明

この問題を解決するつまり検索結果をページ移動しても保持し続けるにはどうすればよいでしょうか?
それぞれのコードはこちらです

pagination

1{% load static %} 2{% block customcss %} 3 <link rel='stylesheet' href="{% static 'style.css' %}"> 4{% endblock customcss %} 5 6<div class="page"> 7 <ul class="pagination"> 8 <!-- 前へ の部分 --> 9 {% if page_obj.has_previous %} 10 <li class="page-item"> 11 <a class="page-link" href="?page={{ page_obj.previous_page_number }}"> 12 <span aria-hidden="true">&laquo;</span> 13 </a> 14 </li> 15 {% else %} 16 <li class="page-item"> 17 <a class="page-link" href="#"> 18 <span aria-hidden="true">&laquo;</span> 19 </a> 20 </li> 21 {% endif %} 22 23 <!-- 数字の部分 --> 24 {% for num in page_obj.paginator.page_range %} 25 {% if page_obj.number == num %} 26 <li class="page-item active"><a class="page-link" href="#!">{{ num }}</a></li> 27 {% else %} 28 <li class="page-item"><a class="page-link" href="?page={{ num }}">{{ num }}</a></li> 29 {% endif %} 30 {% endfor %} 31 32 <!-- 次へ の部分 --> 33 {% if page_obj.has_next %} 34 <li class="page-item"> 35 <a class="page-link" href="?page={{ page_obj.next_page_number }}"> 36 <span aria-hidden="true">&raquo;</span> 37 </a> 38 </li> 39 {% else %} 40 <li class="page-item"> 41 <a class="page-link" href="#"> 42 <span aria-hidden="true">&raquo;</span> 43 </a> 44 </li> 45 {% endif %} 46 </ul> 47</div> 48

views

1from django.shortcuts import render 2from django.views.generic import ListView,CreateView,UpdateView 3from .models import TodoModel 4from django.urls import reverse_lazy 5from django_filters.views import FilterView 6from .filters import TodoFilter 7from django.shortcuts import redirect 8from .form import TodoForm 9from django.conf import settings 10import datetime 11from django.core.mail import send_mail 12# Create your views here. 13 14class TodoList(FilterView): 15 template_name = 'list.html' 16 model = TodoModel 17 paginate_by = 10 18 19 filterset_class = TodoFilter 20 strict = False 21 22 def get(self, request, **kwargs): 23 if request.GET: 24 request.session['query'] = request.GET 25 else: 26 request.GET = request.GET.copy() 27 if 'query' in request.session.keys(): 28 for key in request.session['query'].keys(): 29 request.GET[key] = request.session['query'][key] 30 31 return super().get(request, **kwargs) 32 33# 削除ボタンの処理 34 def post(self,request): 35 delete_pk = request.POST['delete'] 36 TodoModel.objects.filter(pk=delete_pk).delete() 37 return redirect('list') 38 39# 通知処理 40 nowtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M') 41 time = datetime.datetime.strptime(nowtime,'%Y-%m-%d %H:%M') 42 todo_obj = TodoModel.objects.all() 43 for obj in todo_obj: 44 if time == (obj.duedate - datetime.timedelta(minutes=1)): 45 subject = 'タイトル:{}'.format(obj.title) 46 massege = 'メモ:{}\n期日:{}\nカテゴリ:{}\n'.format(obj.memo,obj.duedate,obj.category) 47 from_mail = [] 48 recipient = [settings.EMAIL_HOST_USER] 49 send_mail(subject, massege, from_mail, recipient) 50 51class TodoCreate(CreateView): 52 template_name = 'create.html' 53 model = TodoModel 54 form_class = TodoForm 55 success_url = reverse_lazy('list') 56 57 58class TodoUpdate(UpdateView): 59 template_name = 'update.html' 60 model = TodoModel 61 fields = ('title','memo','priority','duedate','category') 62 success_url = reverse_lazy('list') 63

filter

1from django_filters import filters 2from django_filters import FilterSet 3from .models import TodoModel 4 5class TodoFilter(FilterSet): 6 title = filters.CharFilter(label='タイトル',lookup_expr='contains') 7 8 class Meta: 9 model = TodoModel 10 fields = ('title','priority','duedate','category') 11

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

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

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

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

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

sk-sora--ypi

2021/01/14 03:00

絞り込み検索のmethodはなんですか? AjaxやPOSTにした場合、ボタン押下直後のページでのみその値は保存されるため、 ページネーションを行うと値はリセットされます GET methodを使用して値が存在する時フィルターをかけるというものが定番かと思われます
guest

回答1

0

自己解決

templatetagsフォルダの中に、extra.pyというファイルを作成し、その中に

from django import template register = template.Library() @register.simple_tag def url_replace(request, field, value): dict_ = request.GET.copy() dict_[field] = value return dict_.urlencode()

と記述しさらに、pagination.htmlで、

{% load extra %} ... <a href="?{% url_replace request 'page' paginator.next_page_number %}">

と記述することにより検索結果が保持されながらページングすることが可能になりました。
※templatetagsフォルダはtemplatesフォルダと同じ階層に存在する必要があるのと、templatetagsフォルダが入っているアプリフォルダをsettings.pyにて宣言する必要があります。(INSTALLED_APPSリストの内部に入れる。)

投稿2021/01/14 12:25

reol-777

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問