2012-12-26 4 views
4

Django의 Paginator를 사용하여 한 번에 10 개의 폼을 표시하고자하는 modelsetset이 있지만 paginator = Paginator(formset, 10)처럼 수행 할 수 없습니다. 방법이 있다면 올바른 방법은 무엇입니까?페이지 넘김 Django formset

답변

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

이것에 대해 자세히 설명해 주시겠습니까? 재미 있네. –

+0

'BaseModelFormSet'이'QuerySet' 객체를 필요로하고'list'로 실패 할 것이기 때문에 이것은 동작하지 않을 것입니다. –

+1

이 결과는 다음과 같은 오류가 발생합니다 :'조각이 채워지면 질의를 필터링 할 수 없습니다 .' @GillBates :'object_list' 'list'가 아닌'QuerySet'을 리턴합니다. 그래서 @ Filly의 대답을 사용하십시오! – Caumons

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)