Django の Paginator を使用して一度に 10 個のフォームを表示したいモデル フォームセットがありますが、paginator = Paginator(formset, 10)
. 方法がある場合、これを行う正しい方法は何ですか?
質問する
6323 次
5 に答える
17
これは、私の問題に対して見つけた解決策の一般的な例です。
forms.py
ファイル内:
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = ('description',)
views.py
ファイル内:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
FormSet = modelformset_factory(MyModel, form=MyForm, extra=0)
if request.method == 'POST':
formset = FormSet(request.POST, request.FILES)
# Your validation and rest of the 'POST' code
else:
query = MyModel.objects.filter(condition)
paginator = Paginator(query, 10) # Show 10 forms per page
page = request.GET.get('page')
try:
objects = paginator.page(page)
except PageNotAnInteger:
objects = paginator.page(1)
except EmptyPage:
objects = paginator.page(paginator.num_pages)
page_query = query.filter(id__in=[object.id for object in objects])
formset = FormSet(queryset=page_query)
context = {'objects': objects, 'formset': formset}
return render_to_response('template.html', context,
context_instance=RequestContext(request))
現在のページのオブジェクトでフォームセットを作成する必要があります。そうしないformset = FormSet(request.POST, request.FILES)
と、POST メソッドで実行しようとすると、Django は MultiValueDictKeyError エラーを発生させます。
template.html
ファイル内:
{% if objects %}
<form action="" method="post">
{% csrf_token %}
{{ formset.management_form }}
{% for form in formset.forms %}
{{ form.id }}
<!-- Display each form -->
{{ form.as_p }}
{% endfor %}
<input type="submit" value="Save" />
</form>
<div class="pagination">
<span class="step-links">
{% if objects.has_previous %}
<a href="?page={{ objects.previous_page_number }}">Previous</a>
{% endif %}
<span class="current">
Page {{ objects.number }} of {{ objects.paginator.num_pages }}
</span>
{% if objects.has_next %}
<a href="?page={{ objects.next_page_number }}">next</a>
{% endif %}
</span>
</div>
{% else %}
<p>There are no objects.</p>
{% endif %}
于 2013-01-02T20:41:29.717 に答える
2
これを使用するより正しい方法
...
formset = FormSet(queryset=page_query.object_list)
...
于 2013-03-15T14:33:22.290 に答える
0
ここでの問題は、ブランド (a Page
) を、QuerySet
. だから、私たちはいまいましい必要がありQuerySet
ます。あなたは正しい方法ですが、多くのコードがあります。
ソースコードには次のものがあります。
class Page(collections.Sequence):
def __init__(self, object_list, number, paginator):
self.object_list = object_list
self.number = number
self.paginator = paginator
...
したがって、self.object_list
属性のクエリセットを使用してください。
formset = SomeModelFormSet(queryset=objects.object_list)
于 2014-12-28T00:04:11.927 に答える