2017-01-21 8 views
0

У меня есть форма в models.py моего Джанго проекта:Как пропустить проверку для поля Django в ModelForm с помощью Select2?

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 возвращать True при вызове is_valid(), когда единственная «ошибка» заключается в том, что пользователь ввел новое значение?

Я пробовал переписывать многие классы, но безрезультатно. Я также видел некоторые ответы, которые связаны с использованием специальных виджетов, но я не могу их использовать, потому что мне нужно использовать виджет Select2.

EDIT:

Вот код проверки Джанго внутри класса Field, который является трудным для меня (в частности, цикл):

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