0
我有一个形式,我的Django项目的models.py:如何使用Select2跳过对ModelForm中Django字段的验证?
class Profile(models.Model):
choices = (("choice1", "choice1"), ("choice2", "choice2"), ("choice3", "choice3"))
field = models.CharField(choices=choices)
在forms.py:
class ProfileForm(ModelForm):
class Meta:
model = Profile
fields = ["field"]
widgets = {"field": Select2TagWidget}
我使用Select2TagWidget做出我的选择场更好看,而且还从理论上讲,允许用户输入不在初始列表中的选项。这个前端工作得很好,用户可以输入其他值。但是,当用户使用新值提交时,django表单验证将保存到数据库中。所以我的问题是:
如何保持Select2标记,但强制django在调用is_valid()时返回True,当唯一的“错误”是用户输入新值时?
我已经尝试覆盖很多类,无济于事。我也看到了一些涉及使用特殊小部件的答案,但我无法使用它们,因为我需要使用Select2小部件。
编辑:
这里是Field类是麻烦的,我(特别是for循环)内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