adminコンテンツにjavascript機能の追加をしたい

13 views
Skip to first unread message

yossui

unread,
May 18, 2009, 3:19:03 AM5/18/09
to django-ja
初めて投稿させていただきます。
現在、Django version 1.0.2においてadminの項目作成を行っています。

今やろうとしているのは、3つのプルダウン(生産国、メーカー、車名)がそれぞれ選択されたときのajax的な動作制御です。
それぞれ3つのテーブルから値を取得していて、親子関係で結ばれています。
その上で、生産国が選ばれれば該当するメーカー、車種を再セット。
メーカーが選ばれれば車種を再セットという挙動にしたいと思っています。

過去ログや、ネットで調べた結果からwidgetの追記などの部分的なことはわかったのですが、細かい点
・どのwidgetに追記するのか
・一画面でしかjavascriptは使用しないのでwidgetを開発環境にコピーしようと思うが、どこに置けばいいのか
・widget以外にどのファイルを修正・コピーすればいいのか(forms?)
など、様々な点が不明瞭になっています。

python・Djangoとも初心者ですが、こういったカスタマイズ経験がある方がいらっしゃれば教えていただけると幸いです。

yossui

unread,
May 20, 2009, 9:03:53 PM5/20/09
to django-ja
>>露木さんからのアドバイスを直接メールで頂きましたので、掲載します。
>>アドバイスありがとうございました。
>>参考にさせていただきます。


露木です。

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アプリケーション構築全般で真と
されてる気がします)

以上、参考になれば

tsuyuki makoto

unread,
May 20, 2009, 11:59:43 PM5/20/09
to djan...@googlegroups.com
露木です。

送信先を間違えたようですorz

転送ありがとうございます。

2009/05/21 10:03 yossui <qq6e...@yahoo.co.jp>:
Reply all
Reply to author
Forward
0 new messages