9

Django の Paginator を使用して一度に 10 個のフォームを表示したいモデル フォームセットがありますが、paginator = Paginator(formset, 10). 方法がある場合、これを行う正しい方法は何ですか?

4

5 に答える 5

17

これは、私の問題に対して見つけた解決策の一般的な例です。

forms.pyファイル内:

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

views.pyファイル内:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

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 = FormSet(request.POST, request.FILES)と、POST メソッドで実行しようとすると、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 %}
于 2013-01-02T20:41:29.717 に答える
2

これを使用するより正しい方法

...
formset = FormSet(queryset=page_query.object_list)
...
于 2013-03-15T14:33:22.290 に答える
0

ここでの問題は、ブランド (a 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)
于 2014-12-28T00:04:11.927 に答える