viewsを作り、管理画面以外からも使うことを想定しているのであれば、
ModelFormとAdminFormの両方に対応できる形で実装すれば良いの
ではないでしょうか。
ファイルフィールドの話は良く出てくるので、試しにそれっぽい実装をしてみました。
仮にアプリケーション名をffとしています。もちろんいろいろ手抜きです。
ff/models.py
---------------------------------
from django.db import models
class TestModel(models.Model):
name = models.CharField(max_length=20)
test_file = models.FileField(upload_to='test')
django.forms.FileFieldを継承してファイルの中身を検証するフィールドと
そのフィールドをTestModelのtest_fileに対して適用するためのモデルフォーム。
基本的にImageFieldの丸パクリです。
Djangoに慣れてきたらDjango自体がどうしているのか、コードを読むと
開発効率が上がると思います。
http://code.djangoproject.com/browser/django/tags/releases/1.0.2/django/forms/fields.py
ff/forms.py
---------------------------------
#coding:utf-8
from django import forms
from ff.models import TestModel
from StringIO import StringIO
class ForbiddenEveresFileField(forms.FileField):
def clean(self, data, initial=None):
f = super(ForbiddenEveresFileField, self).clean(data, initial)
if f is None:
return None
elif not data and initial:
return initial
if hasattr(data, 'temporary_file_path'):
file = data.temporary_file_path()
else:
if hasattr(data, 'read'):
file = StringIO(data.read())
else:
file = StringIO(data['content'])
for l in file:
if 'everes' in l: #不正なフォーマットだった場合
raise forms.ValidationError('Invalid Format')
return f
class TestForm(forms.ModelForm):
test_file = ForbiddenEveresFileField()
class Meta:
model = TestModel
アドミンフォームにモデルフォームを指定して、それからアドミンフォームと
モデルをひもづける。
ff/admin.py
---------------------------------
from django.contrib import admin
from ff.models import TestModel
from ff.forms import TestForm
class TestAdmin(admin.ModelAdmin):
form = TestForm
class Meta:
model = TestModel
admin.site.register(TestModel, TestAdmin)
とりあえず管理画面でだけ使う場合には、TestFormのclass Metaは不要なはず。
もっとごりごりやる方法もあるでしょうが、基本は以下だと思います。
* 入力値単体で検証できるValidationはFormやFormのFieldで行う
(これはDjangoに限らず、Webアプリケーション構築全般で真と
されてる気がします)
以上、参考になれば
2009/05/19 8:41 Sato <maip...@kiwi.ne.jp>: