17 feb 2013

[HOW TO] Paginate a Django formset

Last month I needed to paginate a Django model formset and I couldn't find the way to do it, but I found posts asking the same question without an answer, so here is my solution:

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)
    if formset.is_valid():
        formset.save()
    return HttpResponse('Formset submited!')
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 = MyModel.objects.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:

{% extends "base.html" %}
{% block content %}

Paginated formset

{% if objects %}
{% csrf_token %} {{ formset.management_form }} {% for form in formset.forms %} {{ form.id }}

Name: {{ form.instance.name }}

{{ form.as_p }}
{% endfor %}
{% else %}

There are no objects.

{% endif %} {% endblock %}

14 feb 2013

Sprint Django en Córdoba (23 de Febrero)


El fin de semana del 23 al 24 de este mes se realizan en varias ciudades del mundo sprints de Django, como "una excusa para que la gente centre toda su atención, por un tiempo determinado, en mejorar Django."

Cito el mail del evento de la lista de PyAr:

La idea es que nos juntemos y entre todos aprendamos entre otras cosas cómo es el flujo de trabajo para implementar o proponer un feature o bugfix en Django. No hace falta experiencia previa al respecto, solo llevar ganas y tu portátil, no llevar miedos ni vergüenzas. Planeamos armar una charla introductoria cortísima para entrar en calor y nivelar aspectos básicos. ¡Los esperamos!

El evento se va a realizar en las oficinas de Machinalis, Paraguay 70 (ver mapa), el 23 de Febrero, desde las 10 a.m. hasta las 18 p.m.

Se pueden anotar desde la página del evento en Lanyrd.

Para más información sobre los sprints de Django, pueden visitar el sitio del framework.