<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title> &#187; django</title>
	<atom:link href="http://www.simple10.com/topics/django/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.simple10.com</link>
	<description>Simple is good.</description>
	<lastBuildDate>Mon, 19 Oct 2009 21:10:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Ordered Formsets in Google App Engine Patch</title>
		<link>http://www.simple10.com/2009/10/google-app-engine-patch-django-formsets/</link>
		<comments>http://www.simple10.com/2009/10/google-app-engine-patch-django-formsets/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 20:55:53 +0000</pubDate>
		<dc:creator>joe</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[appenginepatch]]></category>
		<category><![CDATA[googleappengine]]></category>

		<guid isPermaLink="false">http://simple10.com/?p=105</guid>
		<description><![CDATA[The current version (1.1RC) of Google App Engine Patch does not allow for easy ordering of forms in formsets.  Normally, Django obeys a model&#8217;s Meta.ordering property as the default for formset data.  However, Google App Engine Patch fetches unordered data by default.

There may already be an undocumented solution from the Google App Engine Patch team, [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>The current version (1.1RC) of <a href="http://code.google.com/p/app-engine-patch/">Google App Engine Patch</a> does not allow for easy ordering of forms in formsets.  Normally, Django obeys a model&#8217;s Meta.ordering property as the default for formset data.  However, Google App Engine Patch fetches unordered data by default.<br />
<span id="more-105"></span><br />
There may already be an undocumented solution from the Google App Engine Patch team, but here&#8217;s a slick unobtrusive workaround that provides a lot of flexibility.</p>
<p>First off, we need a new Formset class and formset factory function &#8230;</p>
<pre language="python" line="1">
# formsets.py
from django.forms.models import inlineformset_factory
from django.forms.models import BaseInlineFormSet

class OrderedFormset(BaseInlineFormSet):
    def __init__(self, data=None, files=None, instance=None,
                 save_as_new=False, prefix=None):
        qs = ()
        if hasattr(self.form, 'Meta') and hasattr(self.form.Meta, 'ordering'):
            qs = instance.__getattribute__(self.model.__name__.lower()+'_set')
            for i in self.form.Meta.ordering:
                qs.order(i)
        self.instance = instance
        self.save_as_new = save_as_new
        super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix, queryset=qs)

def orderedformset_factory(parent_model, model, **kwargs):
    kwargs['formset'] = OrderedFormset
    fs = inlineformset_factory(parent_model, model, **kwargs)
    return fs
</pre>
<p>Usage is as simple as specifying formset_factory=orderedformset_factory for each formset field&#8230;</p>
<pre language="python" line="1">
# forms.py
from formsets import orderedformset_factory

class GuestForm(forms.ModelForm):
    confirmed = forms.BooleanField(required=False)
    class Meta:
        model = Guest
        ordering = ('first_name',)

class EventForm(forms.ModelForm):
    guests = FormSetField(Guest, form=GuestForm, extra=10, can_order=False, formset_factory=orderedformset_factory)
    class Meta:
        model = Event
        ordering = ('number',)
EventForm = FormWithSets(EventForm)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.simple10.com/2009/10/google-app-engine-patch-django-formsets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
