Я переопределил метод clean () в форме django и исправил возникшую ошибку.Но я не понимаю, как ошибка была исправлена - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь добавить подтверждение в форму.

  • Проверка 1: количество_темпов должно быть больше 0.
  • Проверка 2: источник и пункт назначения должны отличаться
  • Проверка 3: количество_модем должно быть меньше количества вместоположение источника.

Код ошибки

# NOTE: Overriding the default method
def clean(self):
    cleaned_data = super().clean()
    source = str(cleaned_data['source'])
    destination = str(cleaned_data['destination'])
    quantity_moved = cleaned_data['quantity_moved']
    item = cleaned_data['item']

    # Checking if the source and destination are same
    if destination == source:
        msg = 'エラー:移動先と移動元が同じです。'
        self.add_error('source', msg)
        self.add_error('destination', msg)

    # Checking if the quantity to move is more than the current stock at the source location
    max_qty = ActualStock.objects.filter(item=item, location=cleaned_data['source'])[0].current_stock
    print(">" * 80, max_qty)

    if quantity_moved > max_qty:
        msg = "エラー:移動元に商品の数は足りません。現在, {0}に {1}の数は {2} です。".format(source, item, max_qty)
        self.add_error('quantity_moved', msg)
    return cleaned_data

Теперь, во время тестирования, если я ввожу одинаковые значения для источника и назначения (оба выбираются из соответствующих раскрывающихся списковкоторый указывает ту же таблицу в БД), я получаю KeyError.

Теперь, если я изменю порядок проверок, которые я выполняю, как показано ниже, код работает.

Рабочий код:

# NOTE: Overriding the default method
def clean(self):
    cleaned_data = super().clean()
    source = str(cleaned_data['source'])
    destination = str(cleaned_data['destination'])
    quantity_moved = cleaned_data['quantity_moved']
    item = cleaned_data['item']

    # Checking if the quantity to move is more than the current stock at the source location
    max_qty = ActualStock.objects.filter(item=item, location=cleaned_data['source'])[0].current_stock
    print(">" * 80, max_qty)

    if quantity_moved > max_qty:
        msg = "エラー:移動元に商品の数は足りません。現在, {0}に {1}の数は {2} です。".format(source, item, max_qty)
        self.add_error('quantity_moved', msg)


    # Checking if the source and destination are same
    if destination == source:
        msg = 'エラー:移動先と移動元が同じです。'
        self.add_error('source', msg)
        self.add_error('destination', msg)

    return cleaned_data

Как я уже сказал, мне удалось исправить ошибку, но я не понимаю, что исправило ошибку здесь.Хотите знать, если кто-то может пролить немного света.

1 Ответ

0 голосов
/ 29 ноября 2018

Из документов Django:

Обратите внимание, что add_error () автоматически удаляет поле из cleaned_data.

Так что в вашем первом примере кода, если назначение равно источнику,Вы вызываете add_error для обоих source и destination , и когда вы хотите получить источник из cleaned_data следующим образом:

max_qty = ActualStock.objects.filter(item=item, location=cleaned_data['source'])[0].current_stock

Вы получаете ошибку ключа, поскольку ключ source был удален из cleaned_data

Во втором примере вы пытаетесь получить исходный код перед вызовом add_error для него.Вы можете решить эту проблему более надежно, изменив эту строку кода

max_qty = ActualStock.objects.filter(item=item, location=cleaned_data['source'])[0].current_stock

На это:

max_qty = ActualStock.objects.filter(item=item, location=source)[0].current_stock
...