django分页 - 记住页面上选中的复选框

时间:2009-12-29 23:51:05

标签: django pagination

我实际上想在

中完成与用户相同的事情

Remembering checked checkboxes across pages - what's the best way?

问。但不是php,我想要django。由于django很棒: - )

我正在使用分页,并希望在用户浏览分页提供的页面时记住选中的复选框。

现在我正在寻找一个如何实现这一目标的最佳实践。我真的不知道如何才能做到这一点。我的想法将包括javascript,但我确信在某处有一个没有js的解决方案。

1 个答案:

答案 0 :(得分:1)

我想不出用分页器做这件事的任何方法。但这是formwizarddynamic forms的好地方。一般的想法是为每个“页面”创建一个动态表单,然后创建一个表单向导以将它们组合在一起。这样可以将复选框保存在多个页面中,让您轻松地前后移动。最好的是它几乎不需要代码!

这样的事情应该能够处理所有事情:

from django.contrib.formtools.wizard import FormWizard
from django import forms
from django.forms.extras.widgets import CheckboxSelectMultiple
from django.core.paginator import Paginator

# In your forms.py --------------


def MPageFormMaker(paginator):
    """
    Create a "paginated" group of forms based on a queryset and num-per-page item.
    """


    def Sform(this_q):
        """
        Create this page's items
        """
        class _PageForm(forms.Form):
            items = forms.ModelMultipleChoiceField(queryset = this_q,
                                widget = forms.CheckboxSelectMultiple)
        return _PageForm

    for i in range(paginator.num_pages):
        yield Sform(paginator.page(i).object_list)


class MpageForm(FormWizard):
    def done(self, request, formlist):
        #do something with the list of forms


#----- In your views.py

def MpageChecker(request):
    qset = Item.objects.all()

    paginator = Paginator(qset, 30)
    formwizard = MPageForm(list(MPageFormMaker(paginator)))

    #then deal with it like a normal formwizard

基本上只是实例化formwizard类,然后让它处理所有事情。由于它使用paginator类来制作表单,因此您可以使用任何类型的个性化。

顺便说一句:我没有测试过这段代码,所以可能会有一些错别字,但它应该足以让你上路了。

编辑...修复排序问题,现在所有排序都应该在页面之间正确保存!