2011-12-12 9 views
8

私は限られた選択肢を持つフィールドを作成しようとしている:私はルールに違反するコンテンツを挿入しようとしていたときdjangoモデルCharField:max_lengthは機能しませんか?

Action_Types=(
       ('0','foo'), 
       ('1','bar'), 
      ) 

class Foo(models.Model): 
    myAction=models.CharField(max_length=1,choices=Action_Types) 

    def __unicode__(self): 
     return '%d %s'%(self.pk,self.myAction) 

は、しかし、それは「manage.pyシェル」で(エラーや警告メッセージなしに成功しました)。任意の長さのテキストをこのフィールドに入れることができます。私はSQLite3をバックエンドとして使用しています。

そういうことになっていますか?それとも私が何かを見逃していたら?

答えて

16

SQLiteはVARCHARの長さを強制しません。 SQLite Frequently asked questionsから

(9)SQLiteの中VARCHARの最大サイズは?

SQLiteはVARCHARの長さを強制しません。あなたはVARCHAR(10)を宣言することができ、SQLiteは500文字を入力できるようになります。そして、それは500文字全てをそのまま維持するでしょう - 決して切り詰めることはありません。

django管理者またはモデルフォームを使用してデータベースを更新すると、Djangoは長さの検証を行います。シェルでは、保存する前に手動でfull_cleanを呼び出して検証エラーをキャッチすることができます。

f = Foo(myAction="more than 1 char") 
try: 
    f.full_clean() 
    f.save() 
except ValidationError as e: 
    # Do something based on the errors contained in e.message_dict. 
+1

答えてくれてありがとう、Alasdair!正しさをチェックする唯一の場所のように見えるのは、full_clean()を使うことです。 –

関連する問題