###前提・実現したいこと
いつもお世話になっており大変感謝しております。
今回は表記の通り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 }}">«</a></li> {% else %} <li class="disabled"><span>«</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 }}">»</a></li> {% else %} <li class="disabled"><span>»</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機能を実装するためには、いかにしてコーディングするのが適格でしょうか。
皆様のお知恵を拝借させて頂ければ幸いです。
何卒宜しくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/19 12:59
2017/09/19 13:05
退会済みユーザー
2017/09/19 13:16
2017/09/19 13:21
退会済みユーザー
2017/09/19 13:33
退会済みユーザー
2017/09/19 14:11
2017/09/19 14:19
退会済みユーザー
2017/09/19 23:29
2017/09/20 00:18
退会済みユーザー
2017/09/20 12:50 編集
2017/09/20 14:16