python、djangoで掲示板を作ってみたい⑨
ページネーションが出来ないやんけええええええええええええええええええええええええええええええええ!!!!!!!!!!!!
ページネーションが出来ない
見落としていた・・・。というか気が付きませんでした。
現在このような形でListViewを作っています。
class ListView(generic.ListView): model = Post paginate_by = 5 def get_queryset(self): return Post.objects.order_by('-date')
この場合ページネーションは urls.py
path('', views.ListView.as_view(), name='board'),
そして board.html
{% include 'board/page4.html' %}
{% load static %} <link rel="stylesheet" type="text/css" href="{% static 'board/style.css' %}"> <nav aria-label="Page navigation"> <ul class="pagination"> {% if page_obj.has_previous %} <li class="page-item"> <a class="page-link" href="?page={{ page_obj.previous_page_number }}"> <span aria-hidden="true">«</span> </a> </li> {% endif %} {% for link_page in page_obj.paginator.page_range %} {% if link_page == page_obj.number %} <li class="page-item active"> <a class="page-link" href="?page={{ link_page }}"> {{ link_page }} </a> </li> {% else %} <li class="page-item"> <a class="page-link" href="?page={{ link_page }}"> {{ link_page }} </a> </li> {% endif %} {% endfor %} {% if page_obj.has_next %} <li class="page-item"> <a class="page-link" href="?page={{ page_obj.next_page_number }}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> {% endif %} </ul> </nav>
のような形で実現できます。
しかし今回はFormViewを一覧ページに実装しているため・・・
class FormView(generic.CreateView): model = Post form_class = PostForm template_name = 'board/board.html' success_url = reverse_lazy('board:board') class ListView(generic.ListView): model = Post paginate_by = 5 def get_queryset(self): return Post.objects.order_by('-date') class FormAndListView(FormView, ListView, TemplateResponseMixin): def get(self, request, *args, **kwargs): question = Question.objects.all() formset = PostForm(request.POST or None, files=request.FILES or None) formView = FormView.get(self, request, *args, **kwargs) listView = ListView.get(self, request, *args, **kwargs) formData = formView.context_data['form'] listData = listView.context_data['object_list'] context = {'form' : formData, 'post_list' : listData, 'question': question} return render(request, 'board/board.html', context)
urls.py
path('', views.FormAndListView.as_view(), name='board'),
のようにしているためListViewとみなされず paginate_by = 5の5つ目のコメントで一覧が終わってしまい2ページ目に続くリンクが出てこないのです。 これは全然気が付きませんでした。
やはり成人先生
青ざめましたよ・・・。青ざめましたこれ・・・。
でもやはり成人先生のブログが解決の起点になりました。
Django、クラスベースビューの機能を組み合わせる - naritoブログ
ListView + CreateViewっていうところです。 最初このまま写してみました。
from django.views.generic.edit import ModelFormMixin class ListView(generic.ListView, ModelFormMixin): model = Post fields = '__all__' success_url = reverse_lazy('board:board') template_name = 'board/board.html' paginate_by = 5 question = Question.objects.all() def get(self, request, *args, **kwargs): self.object = None return super().get(request, *args, **kwargs) def post(self, request, *args, **kwargs): self.object = None self.object_list = self.get_queryset() form = self.get_form() if form.is_valid(): return self.form_valid(form) else: return self.form_invalid(form) context = { 'queston':question } return render(request, 'board/board.html', context) def get_queryset(self): return Post.objects.order_by('-date')
きたあああああああああああああ!!!!!!!!!!!!!!!
やっぱりListViewのクラスにして、Formを追加みたいな形じゃないとだめみたい。
先生のコメントにも 複雑に見えると思いますが、実際複雑です。ModelFormMixinは、少なくともListViewと一緒に使うように設計されてはいないようです。 とりあえず動くものはできました。ページングはできるし、ちゃんと作成はできるし、フォーム内容に不備があればそれも反映されます。ページング処理を楽に実装したいのでListViewを軸にしましたが、CreateViewでPost.objects.allとするか、関数ビューの方が楽かもしれませんね。fields属性の代わりに、form_classでもOKです。
やっぱりページングできるんだ!!!よっしゃ!!!青ざめた顔が戻りました。 …けどなんかおかしいぞ。
フォームクラスから読みこまず新規作成(のような形?)しているため
file = forms.FileField(required=False) ①画像が無くても投稿可能 file = forms.FileField( label='', ②fileアップロード部分のラベルを消去 required=False, ③画像が無くても投稿可能 ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for field in self.fields.values(): field.widget.attrs['class'] = 'form-control' ④bootstrapを使ったフォームのcss
ここら辺の部分がなかったことになっています。
えっ。これ全部関数で書くの・・・。いやそれは俺のレベルじゃできな(ry
複雑に見えると思いますが、実際複雑です。ModelFormMixinは、少なくともListViewと一緒に使うように設計されてはいないようです。 とりあえず動くものはできました。ページングはできるし、ちゃんと作成はできるし、フォーム内容に不備があればそれも反映されます。ページング処理を楽に実装したいのでListViewを軸にしましたが、CreateViewでPost.objects.allとするか、関数ビューの方が楽かもしれませんね。fields属性の代わりに、form_classでもOKです。
先生~~~~~~~~~~~~~~~!!!!!!!!!!!!!!!!!!!!
えいっ!
class ListView(generic.ListView, ModelFormMixin): model = Post fields = '__all__' → form_class = PostForm (ここを変更) form_class = PostForm success_url = reverse_lazy('board:board') template_name = 'board/board.html'
よしっ!!!
ただまだquestionが表示されないな・・・。
・・・。追加!!!
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['question'] = Question.objects.all() return context
できた!!
結局聞いたんだけど参考にするならここらへんかな! DjangoのListViewで、ページをフィルタしてみた - メモ的な思考的な
あとは・・・。いいねボタンで遷移したページはページネーションが動作しないんだよな・・・。 これはもしかして解決できないかもしれないな・・・。 それと管理画面で画像の無い投稿を編集しようとすると画像が無いと編集できませんと表示される。 これを解決したい。
python、djangoで掲示板を作ってみたい① - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい② - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい③ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい④ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑤ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑥ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑦ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑧ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定
python、djangoで掲示板を作ってみたい⑨ - ニートがベルマーレ好きすぎて会社起こしたけど今後は未定