我有一個模型formset,我想一次使用Django的Paginator顯示10個表單,但它不能像paginator = Paginator(formset, 10)
那樣完成。如果有辦法,那麼做到這一點的正確方法是什麼?Paginate Django formset
4
A
回答
13
這是我發現我的問題的解決方案的通用例子:
在forms.py
文件:
class MyForm(ModelForm):
class Meta:
model = MyModel
fields = ('description',)
在views.py
文件:
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,否則,當您在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
在這裏的問題是,您使用的上下文品牌(一個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)
相關問題
- 1. Django Formset vs Modelform
- 2. django unboundlocalerror formset
- 3. Django formset:POST formset
- 4. django admin inline formset
- 5. Django Tabular Formset
- 6. MultiValueDictKeyError Django的FORMSET
- 7. formset應該包含有效的Django Formset
- 8. django formset導致ValidationError
- 9. Django formset重複值
- 10. Django 1.4 formwizard with formset
- 11. Django formset不驗證
- 12. Django的FORMSET cleaned_data空
- 13. Django Formset不工作
- 14. Django嵌套formset snag
- 15. Django動態嵌套Formset
- 16. 在django-angular中使用formset
- 17. Django模型formset問題
- 18. 通過ajax驗證django formset
- 19. 沒有實例的Django Formset
- 20. django複雜的formset問題
- 21. 使用django formset時出錯
- 22. Django formset沒有保存
- 23. Django內聯formset錯誤
- 24. Django和空的formset有效
- 25. Django:模板中的空formset
- 26. 有效使用django formset?
- 27. Django formset with manytomany through intermediate model
- 28. 驗證Django Admin Inline Formset
- 29. django-dynamic-formset和django-autocomplete-light集成bug
- 30. Django:動態formset與jquery只保存第一個formset實例
你能詳細說明一下嗎?看起來很有趣。 –
這是行不通的,因爲'BaseModelFormSet'需要'QuerySet'對象,並且會失敗並帶有'list' –
這導致出現以下錯誤:'一旦切片已被採用,就無法過濾查詢。'@GillBates:'object_list'返回一個'QuerySet',而不是'list'。所以使用@菲利的答案! – Caumons