Django의 Paginator를 사용하여 한 번에 10 개의 폼을 표시하고자하는 modelsetset이 있지만 paginator = Paginator(formset, 10)
처럼 수행 할 수 없습니다. 방법이 있다면 올바른 방법은 무엇입니까?페이지 넘김 Django formset
4
A
답변
13
이것은 내가 내 문제에 발견 된 솔루션의 일반적인 예입니다 : 당신은 만들 필요가
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))
다음 views.py
파일에서
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = ('description',)
다음 forms.py
파일에서
현재 페이지의 객체와 formset을 비교합니다. 그렇지 않으면 POST 메서드에서 formset = FormSet(request.POST, request.FILES)
을 수행하려고 시도하면 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 %}
1
더 올바른 방법은 여기
...
formset = FormSet(queryset=page_query.object_list)
...
0
문제는 당신이 QuerySet
을 기대하고있어 상황에 맞는 브랜드 (A Page
)를 사용하는 것입니다 사용 . 그래서 우리는 망할 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)
이것에 대해 자세히 설명해 주시겠습니까? 재미 있네. –
'BaseModelFormSet'이'QuerySet' 객체를 필요로하고'list'로 실패 할 것이기 때문에 이것은 동작하지 않을 것입니다. –
이 결과는 다음과 같은 오류가 발생합니다 :'조각이 채워지면 질의를 필터링 할 수 없습니다 .' @GillBates :'object_list' 'list'가 아닌'QuerySet'을 리턴합니다. 그래서 @ Filly의 대답을 사용하십시오! – Caumons