私は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の代わりに使用しても問題は解決されません。
Djangoエラーは、値が選択肢のリスト内にあるかどうかをチェックする検証によって発生します。この検証は私には本当の目的ではありません。データベースや型の完全性をチェックしません。私は具体的に私の質問に発生するコードを掲載しました。 – TheRuler