после успешного вызова is_valid () отобразить форму django с пользовательским сообщением об ошибке - PullRequest
1 голос
/ 24 ноября 2010

У меня есть форма django, которая сначала проверяет свои данные с помощью вызова form.is_valid ().Если это не так, форма отображается повторно, с сообщением об ошибке относительно недействительных данных.Теперь, если is_valid () имеет значение true, я пытаюсь сохранить данные в бэкэнде ldap.Если form.cleaned_data не соответствует типу данных ldap, я получаю исключение из моего метода сохранения ldap.Теперь, что я хотел бы сделать в этом случае, это повторно отобразить форму с сообщением об ошибке, точно так же, как это происходит после того, как form.is_valid () возвращает false.Я попытался прочитать некоторые документы, а также некоторый исходник django, но не смог найти, где я мог бы подключиться к этому.

Альтернативой было бы аккуратное построение формы (пользовательских) полей формы, которые "гарантировали бы"данные уже совместимы с синтаксисом ldap.Но я хотел бы убедиться, что я улавливаю синтаксические ошибки ldap и отображаю их в удобной форме.Так что, если бы я мог подключиться к этому механизму перерисовки формы, я бы стал счастливым маленьким программистом: -)

Есть идеи или советы?

Ответы [ 3 ]

2 голосов
/ 24 ноября 2010

Под вашим классом для формы, которая расширяется forms.Form, добавьте один из следующих методов, предполагая, что у вас где-то определено is_valid_ldap_data():

для всей формы:

def clean(self):
    if !is_valid_ldap_data(self.cleaned_data.get("fieldname")):
        raise forms.ValidationError("Invalid LDAP data type");
    return self.cleaned_data

или для одного поля:

def clean_fieldname(self):
    if !is_valid_ldap_data(self.cleaned_data['fieldname'])):
        raise forms.ValidationError("Invalid LDAP data type");
    return self.cleaned_data['fieldname']
1 голос
/ 24 ноября 2010

В вашем подклассе Form реализуйте метод проверки пользовательских полей

http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-a-specific-field-attribute

Валидационная логика должна идти туда, куда ей нужно. Если form.is_valid() == True, то form.cleaned_data должно быть действительным. Просто потому, что код так говорит. Вы хотите скрыть некоторую логику проверки в другом месте - и это просто плохая практика.

0 голосов
/ 24 ноября 2010

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

но в любом случае, если форма недействительна по какой-либо причине (как в вашем случае), is_valid должен возвращать False.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...