Login

Reorder fields directly in the ModelForm

Author:
HM
Posted:
May 16, 2008
Language:
Python
Version:
.96
Tags:
newforms modelform field-order workaround
Score:
6 (after 6 ratings)

Sometimes the order of the fields you get from a model needs to be adjusted when displaying its modelform. If it's just a few fields you can do it in the template, but what if you want to iterate over the form?

The fields are stored in a SortedDict, so you can change the order in the init of the form. A bit clunky, yes.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# This code is Public Domain where the Public Domain exists,
# and covered by an MIT-license everywhere else (that is: 
# do as you wish with it, but you don't get to blame me 
# for anything)

class Demo(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()
    c = models.IntegerField()

class DemoForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(DemoForm, self).__init__(*args, **kwargs)
        # order now: a b c
        value = self.fields.pop('c')
        new_pos = self.fields.keyOrder.index('b')
        self.fields.insert(pos, 'c', value)
        # order now: a c b

    class Meta:
        model = 'Demo'

More like this

Comments

danux (on July 11, 2008):
<p>Line 19 should read:</p> <pre> self.fields.insert(new_pos, 'c', value) </pre> <p>Otherwise an excellent snippet that just saved my skin, thank you</p>

#

obioma (on September 5, 2008):
<p>Thanks for the snippet, here a little bit more generic:</p> <pre>def __init__(self, *args, **kwargs): super(DemoForm, self).__init__(*args, **kwargs) # order now: a b c order = ('b', 'c', 'a') tmp = copy(self.fields) self.fields = SortedDict() for item in order: self.fields[item] = tmp[item] </pre> <p>I wonder if it would make sense to include this order in the meta class part and do internally.</p>

#

Please login first before commenting.