分页Django表单 [英] Paginate Django formset

查看:124
本文介绍了分页Django表单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个模型表单,我想使用Django的Paginator一次显示10个表单,但不能像 paginator = Paginator(formset,10)。这样做的正确方法是什么,如果有办法?

解决方案

这是一个我发现的解决方案的通用示例我的问题:



forms.py 文件中:



$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / code>

views.py 文件中:

  FormSet = modelformset_factory(MyModel,form = MyForm,extra = 0)
如果request.method =='POST':
formset = FormSet(request.POST,request.FILES)
#你的验证和其余的'POST'代码
else:
query = MyModel.objects.filter(condition)
paginator = Paginator(查询,10)#每页显示10个表单
page = request.GET.get('page')
try:
objects = paginator.page(page)
除了PageNotAnInteger:
objects = paginator.page(1)
exc ept EmptyPage:
objects = paginator.page(paginator.num_pages)
page_query = query.filter(id__in = [object.id for objects 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错误。



code> template.html file:

  {%if objects%} 
< form action =method =post>
{%csrf_token%}
{{formset.management_form}}
{form for formset.forms%}
{{form.id}}
< ;! - 显示每个表单 - >
{{form.as_p}}
{%endfor%}
< input type =submitvalue =保存/>
< / form>

< div class =pagination>
< span class =step-links>
{%if objects.has_previous%}
< a href =?page = {{objects.previous_page_number}}>上一个< / a>
{%endif%}

< span class =current>
{{objects.paginator.num_pages}}的{{objects.number}}}
< / span>

{%if objects.has_next%}
< a href =?page = {{objects.next_page_number}}> next< / a>
{%endif%}
< / span>
< / div>
{%else%}
< p>没有对象。< / p>
{%endif%}


I have a model formset that I want to display 10 forms at a time using Django's Paginator, but it can't be done like paginator = Paginator(formset, 10). What's the correct way to do this, if there is a way?

解决方案

This is a generic example of the solution I found to my problem:

In the forms.py file:

class MyForm(ModelForm):
    class Meta:
        model = MyModel
        fields = ('description',)

In the views.py file:

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))

You need to create the formset with the objects in the present page, otherwise, when you try to do formset = FormSet(request.POST, request.FILES) in the POST method, Django raises a MultiValueDictKeyError error.

In the template.html file:

{% 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 %}

这篇关于分页Django表单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆