ModelFormでfieldの表示順番を変える

Django 1.1から加わった機能です。

fieldの表示順序

従来はModelFormを使ったformオブジェクトを表示する際のfieldの並びは
modelのfieldの順序と同じでした。
そのため、順序を変えるために少しコーディングをする必要がありました。

そこで、新しく追加された機能fieldsを使ってみましょう。

サンプルmodel,form作成

以下のようなmodelとformを作成します。(template等は省略します。)

models.py

from django.db import models
from django.contrib.auth.models import User

class Tag(models.Model):
    tag = models.CharField(max_length=10)

    def __unicode__(self):
        return self.tag

class Blog(models.Model):
    title = models.CharField(max_length = 50)
    author = models.ForeignKey(User)
    content = models.TextField()
    post_date = models.DateTimeField(default = datetime.now)
    tags = models.ManyToManyField(Tag)

    def __unicode__(self):
        return self.title

    def save(self):
        if not self.id:
            self.post_date = datetime.datetime.now()
        super(Blog, self).save()

forms.py

from django import forms
from appname.models import Blog, Tag

class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog

表示すると以下のようになります。

modelform_fields01_01

formオブジェクトの修正

今度はfieldの表示順番を'title','author','content','tags', 'post_date'に変更します。
内部Metaクラスにfieldsを追加して、表示したい順にリスト形式で記述するだけです。

forms.py

from django import forms
from appname.models import Blog, Tag

class BlogForm(forms.ModelForm):
    class Meta:
        model = Blog
        fields = ['title','author','content','tags', 'post_date']

修正後は以下の通りです。

modelform_fields01_02

小さな追加ですが、フル活用したい機能ですね。

twitter 2010-01-13 20:04:08.653830

Recent Updates

URLConf Tip 01 - キャプチャの有無にかかわらず同一のviewで処理する
Markdownの入力補助"wmd"をAdmin siteで使う
ModelFormでfieldのwidgetを変更する
動的なformを作る 6 - Dynamic Inline Admin site編
Formsetsを使う3 - inlineformset_factory編
動的なformを作る 5 - django-dynamic-formset編
Formクラスからメディアを定義する
複数のmodelを結合する 2 - Proxy model編
複数のmodelを結合する 1
ModelFormでfieldの表示順番を変える
Admin siteのwidgetを個別に変更する
formfield_overridesを使ってAdmin siteのwidgetを変更する
Admin siteのlist_displayをカスタマイズする - リンク編
Admin siteのlist_displayをカスタマイズする - 基本編
Admin siteのTextareaの高さを自在に変更する - admin.py編