2011-01-02 11 views
5

モデルを作成して更新したいとします。どのフィールドが表示され、検証のタイプはアクション(作成または更新)によって異なります。しかし、彼らは依然として多くの同じバリデーションと機能を共有しています。 ModelFormを(インスタンスがどこにでも存在する場合だけでなく)これを処理するためのきれいな方法はありますか?あるいは、2つの異なるモデルフォームを作成する必要がありますか?Djangoのデザインパターン - モデルの作成と更新のためのフォーム

答えて

4

2つの可能性が考えられます。あなたは、フォームの__init__方法で属性を設定することができますいずれかのパラメータに基づいて、明示的に渡す、またはself.instanceが存在するかどうかに基づいており、非なしPKがあります

class MyModelForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     # either: 
     self.edit = kwargs.pop('edit', False) 
     # or: 
     self.edit = hasattr(self, instance) and self.instance.pk is not None 
     super(MyModelForm, self).__init__(*args, **kwargs) 
     # now modify self.fields dependent on the value of self.edit 

他のオプションは、あなたのModelFormのサブクラスを作成することです - 基本クラスの共同機能を維持し、次にサブクラスの特定の作成または更新機能を維持する。

+0

クール、それも私が考えていたものです。それを行うより良い方法があるのだろうかと思っていましたが、これは私にはよく見えます。 – killerbarney

関連する問題