У has_changed () отсутствуют 2 обязательных позиционных аргумента: 'initial' и 'data' - PullRequest
1 голос
/ 20 февраля 2020

Я пытаюсь предотвратить вмешательство пользователя в скрытое поле формы, проверяя вид следующим образом:

if form.fields["email"].has_changed():
    form.add_error(
        "email",
        ValidationError(
            "Email does not correspond to user", code="invalid_email",
        ),
    )

, но я получаю следующую ошибку типа:

has_changed () пропустил 2 обязательных позиционных аргумента: 'initial' и 'data'

На этом этапе form является "связанной формой", которая прошла через пользователя и запрос POST, кстати.

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

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

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Тот факт, что это связанная форма, не имеет большого значения. form.fields - это словарь, отображающий строки в полях формы. Метод has_changed [GitHub] для поля используется формой для определения, действительно ли значение изменилось.

Вы можете проверить, имеет ли значение изменен путем проверки словаря changed_data:

if 'email' in <b>form.changed_data</b>:
    form.add_error(
        "email",
        ValidationError(
            "Email does not correspond to user", code="invalid_email",
        ),
    )
1 голос
/ 21 февраля 2020

После более тщательной проверки моего кода я заметил, что в тот момент, когда я выполнял проверку has_changed (), проверка в форме еще не выполнялась. После перемещения после проверки form.is_valid() has_changed () работал как положено.

...