2017-01-21 70 views
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不解决问题。

回答

-2

具体来说,是什么导致了Django验证错误?

此外,尽量不要跳过Django的验证。这是有原因的。对此的回答很可能涉及清理窗口小部件数据,但我不确定。

+0

Django错误是由验证引起的,该验证检查值是否在选项列表中。这种验证对我来说没有真正的目的:它不检查保护数据库或类型的完整性。我已经发布了代码,特别是在我的问题中。 – TheRuler

相关问题