2009-10-06 5 views

答えて

28

フォームフィールドをカスタマイズするのは簡単です:

class UpperCaseField(forms.CharField): 
    def clean(self, value) 
     try: 
      return value.upper() 
     except: 
      raise ValidationError 

は、基本的には、あなたはそれが値戻りますようにクリーン()メソッドを書き換え、その後、ほとんどあなたが望むものに似ているフィールドを継承するクラスを作成します欲しいです。彼らが働くように書き込まれる必要があるいくつかのより多くの方法があるので、もう少し有用であるが、一方で

class MyObjectField(forms.ModelChoiceField): 
    # in this case, 'value' is a string representing 
    # the primary key of a MyObject 
    def clean(self, value): 
     try: 
      return MyObject.objects.get(pk=value) 
     except: 
      raise ValidationError 

カスタムウィジェットが、行うのは難しいもう少し:ここでは別の例でありますスムーズに。

+1

ありがとうございます。私はフィールドのレンダリングをカスタマイズする必要があるので、私はカスタムウィジェットを書く必要があると思います。 –

+7

注:clean()はto_python()、validate()およびrun_validators()を実行します。 clean()をオーバーライドしてこれらを実装しないと、処理が混乱します。 – orokusaki

+3

orokusakiが正しいとしたら、clean()をオーバーライドするには、少なくともsuper(UpperCaseField、self).clean(value) –

7

それはチュートリアルが、この小さなについてDjangoのドキュメントの話ではありません:組み込みのフィールドクラスが がニーズを満たしていない場合は

、あなたは簡単に カスタムフィールドのクラスを作成することができます。これを行うには、 のサブクラスを作成して django.forms.Fieldというサブクラスを作成します。その唯一の 要件は、 clean()メソッドを実装し、その__init__() メソッドが上記のコア引数 (必須、ラベル、 イニシャル、ウィジェット、help_text)を受け入れることです。

クリーンメソッドについては、at the django docsを参照してください。繰り返しますが、チュートリアルではありませんが、便利です。

django-extensionsなど、利用可能なdjangoアプリプロジェクトのコードを読んでたくさん学んでいますが、これはフォームフィールドをオーバーライドして、良い学習ツール(私にとっては少なくとも)です。これはあなたを始めるのを助けることができます。

14

いつもオープンソースコードと同じように、ソース自体を読むことで多くのことを学べます。さまざまなフォームフィールドがどのように定義されているかを確認するには、django.forms.fieldsモジュールを参照してください。それらのほとんどは他のサブクラスであるため、それを複製して必要なものを変更できます。

+8

最新のソースへのリンク:https://github.com/django/django/blob/master/django/forms/fields.py –

関連する問題