Я дам вам пару советов:
Во-первых, большую часть времени у вас нет (и вы не хотите связываться с инициализатором формы) [1113 ]
Вместо инициализации значений ваших paymentoption
вариантов в форме __init__
лучше создать CustomMultipleChoiceFiled
для этого вопроса.
Например:
class PaymentOptions(MultipleChoiceField):
def __init__(self, choices=None, **kwargs):
super(PaymentOptions, self).__init__(choices=choices, **kwargs)
if choices is None:
self.choices = # ...
, тогда вы можете использовать его, не возиться с формой __init__
.
Во-вторых, не переопределяйте clean
, если в этом нет крайней необходимости , вы можете добавить метод с именем clean_paymentoption
и выполнить там всю необходимую проверку.
Вы можете прочитать об этом в документации:
Метод
clean_<fieldname>()
вызывается на подклассе формы - где<fieldname>
[ 1127] заменяется именем атрибута поля формы. Этот метод выполняет любую очистку, специфичную для этого конкретного атрибута, независимо от типа поля, которым он является. Этот метод не передал никаких параметров. Вам нужно будет найти значение поля в self.cleaned_data и помнить, что на данном этапе это будет объект Python, а не исходная строка, представленная в форме (это будет в cleaned_data, потому что метод field (clean) общего поля Выше уже очищал данные один раз).Например, если вы хотите проверить, что содержимое CharField с именем serialnumber является уникальным, clean_serialnumber () будет правильным местом для этого. Вам не нужно определенное поле (это просто CharField), но вам нужна часть проверки для конкретного поля формы и, возможно, очистка / нормализация данных.
Возвращаемое значение этого метода заменяет существующее значение в cleaned_data, поэтому оно должно быть значением поля из cleaned_data (даже если этот метод не изменил его) или новым очищенным значением.
blockquote>В вашем случае это может быть:
def clean_paymentoption(self): paymentoption = self.cleaned_data.get('paymentoption', None) if paymethod1 == 3 and len(paymentoption) == 0: self.add_error('paymentoption', 'You must select at lease one Offline Payment Option if users must pay in person or over the phone.')
И снова вы избегаете другого вызова
super
, и вызовыsuper
- это хорошая вещь, которую следует избегать, когда вы начинаете получать ошибки трудно отслеживать, как это вы только что опубликовали здесь.