KeyError при установке специфичной для поля ошибки в def clean ()

0
задан Jason Howard 16 January 2019 в 01:21
поделиться

1 ответ

Я дам вам пару советов:

Во-первых, большую часть времени у вас нет (и вы не хотите связываться с инициализатором формы) [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 (даже если этот метод не изменил его) или новым очищенным значением.

В вашем случае это может быть:

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 - это хорошая вещь, которую следует избегать, когда вы начинаете получать ошибки трудно отслеживать, как это вы только что опубликовали здесь.

0
ответ дан Raydel Miranda 16 January 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: