2013-06-17 5 views
0

Я пытаюсь создать пользовательское поле формы в Django.Пользовательское поле формы в Django

class CustomTypedMultipleChoiceField(MultipleChoiceField): 
    def __init__(self, *args, **kwargs): 
     self.coerce = kwargs.pop('coerce', lambda val: val) 
     self.empty_value = kwargs.pop('empty_value', []) 
     super(CustomTypedMultipleChoiceField, self).__init__(*args, **kwargs) 

    def to_python(self, value): 
     """ 
     Validates that the values are in self.choices and can be coerced to the 
     right type. 
     """ 
     value = super(CustomTypedMultipleChoiceField, self).to_python(value) 
     if value == self.empty_value or value in self.empty_values: 
      return self.empty_value 
     new_value = [] 
     for choice in value: 
      try: 
       new_value.append(self.coerce(choice)) 
      except (ValueError, TypeError, ValidationError): 
       raise ValidationError(self.error_messages['invalid_choice'] % {'value': choice}) 
     return new_value 

    def validate(self, value): 
     if value != self.empty_value: 
      super(CustomTypedMultipleChoiceField, self).validate(value) 
     elif self.required: 
      raise ValidationError(self.error_messages['required']) 

Я получаю ошибку CustomTypedMultipleChoiceField не имеет атрибута empty_values. Это тот же самый код, который построил Django в построившемся TypedMultipleChoiceField. Поэтому я не понимаю, почему я получаю эту ошибку. Я также думал о подклассификации TypedMultipleChoiceField, но я хотел, чтобы его ошибка отличалась в методе to_python и не хотела возвращать значение, поэтому выбрал этот метод. Пожалуйста, помогите мне.

+0

Какая версия Django вы используете? –

+1

Django 1.5.1 - это версия, которую я использую. Что это нужно сделать? –

ответ

1

Я не знаю, была ли это опечатка или вы намеревались этот путь, но фактически empty_values (во множественном числе) в вашем коде не определен. Я также рассмотрю исходный код суперкласса MultipleChoiceField и там тоже не определено.

Что я могу найти в супер супер классе вашего класса (ChoiceField), было ссылкой на validator.EMPTY_VALUES и, конечно, заглавными буквами.

Линейка более, так ваш в исходном коде был один:

if value == self.empty_value or value in validators.EMPTY_VALUES: 

Посмотрите глубоко в свой код и посмотреть, если это было то, что вы намеревались сделать.

Надеюсь, это поможет!

+0

Я не собирался менять это, как я уже упоминал в вопросе. Просто хотел изменить часть ошибки. Я видел коды, и в них они также создали типизированное поле множественного выбора таким же образом. Они не получают ошибку, так почему я ее получаю? –

+0

Кажется, ваш код прав. Я предлагаю вам выполнить некоторую отладку с помощью pdb, чтобы узнать, что происходит на самом деле. –

Смежные вопросы