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

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

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

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

Python

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

Q&A

解決済

1回答

4908閲覧

【Django】汎用ビューにおいてpaginationを使いたい

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2017/09/19 11:27

編集2017/09/19 13:32

###前提・実現したいこと
いつもお世話になっており大変感謝しております。
今回は表記の通りpagination機能の実装を目指しておりますが、
色々と問題があるためここで質問させて頂きます。
まずは現在のコードをご確認下さい。

#models.py class Situation(models.Model): s_id = models.IntegerField(primary_key=True) situation = models.CharField(max_length=100, unique=True) class kiji_data(models.Model): situation = models.ForeignKey(Situation) kiji = models.TextField() date = models.DateTimeField(default=datetime.now) password = models.CharField(max_length=30, blank=True)
#forms.py class DetailForm(forms.ModelForm): password = forms.CharField(max_length=30, widget=forms.PasswordInput(attrs={'size': 10}), required=True) class Meta: model = kiji_data fields = ('password',) def __init__(self, *args, **kwargs): self.kiji_data_id = kwargs.pop('kiji_data_id') super(DetailForm, self).__init__(*args, **kwargs) def clean_password(self): password = self.cleaned_data['password'] match_object = kiji_data.objects.get(id = self.kiji_data_id) if password != match_object.password: raise forms.ValidationError('Invalid Password') return password
#views.py class DetailView(FormMixin, generic.DetailView): model = kiji_data form_class = DetailForm template_name = 'detail.html' def get_form_kwargs(self): kwargs = super(DetailView, self).get_form_kwargs() kwargs['kiji_data_id'] = self.kwargs['pk'] return kwargs def get_context_data(self, **kwargs): context = super(DetailView, self).get_context_data(**kwargs) ➀ queryset = kiji_data.objects.filter(pk = self.kwargs['pk']).values('situation__s_id') for dictionary in queryset: pass s_id = dictionary["situation__s_id"] context['s_id'] = s_id ➁ queryset_2 = kiji_data.objects.filter(situation__s_id = s_id) request = self.request paginator = Paginator(queryset_2, 1) page = request.GET.get('page') try: contacts = paginator.page(page) except PageNotAnInteger: contacts = paginator.page(1) except EmptyPage: contacts = paginator.page(paginator.num_pages) context['contacts'] = contacts return context ~~~ フォーム部分は略 ~~~
urls.py url(r'^kiji/(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='kiji'),
#detail.html <!DOCTYPE html> {% extends "base.html" %} {% load staticfiles %} {% block content1 %} <h1>{{ kiji_data.kiji }}</h1> <div class="text-right"> {{ form.password.errors.as_text }} <form class="form-inline" role="form" action="{% url 'myapp:kiji' kiji_data.pk %}" method="POST"> <div class="form-group has-success"> {{ form.password }} {% csrf_token %} <input class="btn btn-danger btn-xs" type="submit" placeholder="password" value="Pass for Edit"> </div> </form> </div> <br> <br> <div class="pull-left"> <ul class="pagination pagination-sm"> {% if contacts.has_previous %} <li><a href="?page={{ contacts.previous_page_number }}">&laquo;</a></li> {% else %} <li class="disabled"><span>&laquo;</span></li> {% endif %} {% for i in contacts.paginator.page_range %} {% if contacts.number == i %} <li class="active"><span>{{ i }} <span class="sr-only">(current)</span></span></li> {% else %} <li><a href="?page={{ i }}">{{ i }}</a></li> {% endif %} {% endfor %} {% if contacts.has_next %} <li><a href="?page={{ contacts.next_page_number }}">&raquo;</a></li> {% else %} <li class="disabled"><span>&raquo;</span></li> {% endif %} </ul> </div> <br> <br> <br> {% endblock content1 %}

かなり強引にDetailViewでpaginationを使うべくコードを書いてみました。
➀get_context_data内で"pk"を使ってurlに引数として渡している記事データのs_idを取得。
➁取得したs_idを持つ記事データをクエリセット内に取得。
それを利用してpagination!と思ったのですが、普通に動作しませんでした。笑
urls.pyに渡したpkを持つ一つの記事が延々とページネーションされるというシュールな状況に陥っております。
request = self.requestを使い、それを引数として渡しているからであろうと思います。

ListViewの使用も一つの選択肢として考えましたが、過日当サイトでした質問のように、"一つの記事データが持つpkを使ったパスワードの照合"という機能も合わせて保持したいため、s_idで絞り込んでpaginationするListViewも合わないような気がしております。

私がした質問の内容

なるべくこの形を崩さないままpagination機能を実装するためには、いかにしてコーディングするのが適格でしょうか。
皆様のお知恵を拝借させて頂ければ幸いです。
何卒宜しくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下の部分を変更するとどうですか。

python

1paginator = Paginator(queryset_2, 1) 23paginator = Paginator(queryset_2, 10) # ここに何件ずつ、の数字を入れる

追記。
以下のように書くと一覧表示ができます。今回ですと6件表示されるはずです。
10件に満たないので、次ページのリンクは表示されなくなります。

python

1{% for kiji in contacts %} 2<p>{{ kiji.kiji }}</p> 3{% endfor %}

投稿2017/09/19 11:51

編集2017/09/19 13:40
toritoritorina

総合スコア972

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

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

退会済みユーザー

退会済みユーザー

2017/09/19 12:59

早速ご回答賜り有難うございます。 10で試したところ、今度はpaginateの件数が1件のみ、前後への移動もできないという状態になりました。 色々と数字を変えてみたのですが、上手く動作しませんでした;
toritoritorina

2017/09/19 13:05

s_idとqueryset_2の値をprintで出力するとどのようになりまか
退会済みユーザー

退会済みユーザー

2017/09/19 13:16

queryset_2は下記の通りです。s_idをもつ記事データが6つ出てきました。 ↓ <QuerySet [<kiji_data: kiji_data object>.......]> s_idは 1 です。
toritoritorina

2017/09/19 13:21

パッと見だと問題はなさそうにみえますね。 テンプレートの内容を記載してもらってもいいですか
退会済みユーザー

退会済みユーザー

2017/09/19 13:33

テンプレート追加致しました。
退会済みユーザー

退会済みユーザー

2017/09/19 14:11

追記確認致しました。 一覧表示ではなくpaginationのように矢印を押すと次の記事へ移るような仕組みを作りたいと思ったのですが、それはやはり難しいでしょうか?
toritoritorina

2017/09/19 14:19

その場合は元々のコードのように paginator = Paginator(queryset_2, 1) と1件づつページングできるようにすれば解決すると思うのですが、こちらでは希望の動作ではないのでしょうか。
退会済みユーザー

退会済みユーザー

2017/09/19 23:29

理解不足で何度も申し訳ございません; 追記頂いたコードをhtmlに追加しても特にpaginationには反映されなかったため上記のコメントをさせて頂きました。 ちなみにpaginator = Paginator(queryset_2, 1)の場合、 取得できる同じs_idを持つ記事は、常に同じ1件のみのようですので、1件づつページが変遷していくという動作は得られないようです。
toritoritorina

2017/09/20 00:18

>>ちなみにpaginator = Paginator(queryset_2, 1)の場合、 >>取得できる同じs_idを持つ記事は、常に同じ1件のみのようですので、1件づつページが変遷していくという動作は得られないようです。 どのページに移動しても同じ内容が表示されてしまっている、ということでしょうか。 <h1>{{ contacts.0.kiji }}</h1>のように変更するといかがでしょうか。 こちらでも解決できなければ、現在どんな動作で、理想はどういう動作なのか、を画面のスクリーンショット等の画像を踏まえて追記されたほうが回答される方も増えると思います。
退会済みユーザー

退会済みユーザー

2017/09/20 12:50 編集

結局上記にて理想の動作は得られなかったのですが、torina様の別のブログ記事を参考に解決に至りました。昨夜からのご教示誠に有り難うございました。 それにしても質問投稿というシステムはなかなか細かいニュアンスが伝えずらいし、受け取りずらいものですねf(^_^; スクリーンショットも交えながら、もう少し詳細に意図を伝えられるよう工夫が必要だと実感いたしました。
toritoritorina

2017/09/20 14:16

Djangoは関連ファイルが多くなってしまうので、その意味でも質問をしようとすると中々難しい部分がありますね。 とにかく解決されたようで、よかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問