2017-01-21 4 views
0

私はDjangoプロジェクトのmodels.pyでフォームを持っている:Select2でModelFormのDjangoフィールドの検証をスキップする方法は?

forms.pyで
class Profile(models.Model): 
    choices = (("choice1", "choice1"), ("choice2", "choice2"), ("choice3", "choice3")) 
    field = models.CharField(choices=choices) 

class ProfileForm(ModelForm): 
    class Meta: 
     model = Profile 
     fields = ["field"] 
     widgets = {"field": Select2TagWidget} 

私は私の選択フィールドが良く見えるようにSelect2TagWidgetを使用するだけでなく、よ理論的には、初期リストにない選択肢にユーザが入ることを可能にする。これのフロントエンドは完璧に機能し、ユーザーは他の値を入力することができます。しかし、ユーザが新しい値でサブミットすると、djangoフォームの検証によってデータベースへの保存がブロックされます。だから私の問題は:

私はどのようにSelect2タグ付けを維持するのですか?ユーザが新しい値を入力したことだけが "エラー"である場合、呼び出し時にis_valid()を呼び出してdjangoをtrueに戻します。

多くのクラスを上書きしようとしましたが、無駄です。私は特別なウィジェットの使用に関するいくつかの答えを見たことがありますが、私はSelect2ウィジェットを使用する必要があるため使用できません。

編集:ここでは

が私のために面倒であるFieldクラス(特にループのための)内部Djangoの検証コードです:

def validate(self, value, model_instance): 
    """ 
    Validates value and throws ValidationError. Subclasses should override 
    this to provide validation logic. 
    """ 
    if not self.editable: 
     # Skip validation for non-editable fields. 
     return 

    if self.choices and value not in self.empty_values: 
     for option_key, option_value in self.choices: 
      if isinstance(option_value, (list, tuple)): 
       # This is an optgroup, so look inside the group for 
       # options. 
       for optgroup_key, optgroup_value in option_value: 
        if value == optgroup_key: 
         return 
      elif value == option_key: 
       return 
     raise exceptions.ValidationError(
      self.error_messages['invalid_choice'], 
      code='invalid_choice', 
      params={'value': value}, 
     ) 

    if value is None and not self.null: 
     raise exceptions.ValidationError(self.error_messages['null'], code='null') 

    if not self.blank and value in self.empty_values: 
     raise exceptions.ValidationError(self.error_messages['blank'], code='blank') 

しかし、このようにそれを上書き:

class NoValidationCharField(models.CharField): 
    def validate(self, value, model_instance): 
     return 

これをCharFieldの代わりに使用しても問題は解決されません。

答えて

-2

具体的には、Django検証エラーの原因は何ですか?

また、Djangoの検証をスキップしないようにしてください。それは理由があります。これに対する答えは、ウィジェットのデータを消毒することですが、わかりません。

+0

Djangoエラーは、値が選択肢のリスト内にあるかどうかをチェックする検証によって発生します。この検証は私には本当の目的ではありません。データベースや型の完全性をチェックしません。私は具体的に私の質問に発生するコードを掲載しました。 – TheRuler

関連する問題