Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 4, 2011 23:23:09

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

Не могу понять как прикрутить проверку двух условий к одному полю!
Пробовал так:

class MyCommentForm(CommentForm):    
__metaclass__ = CommentMetaclass
name = forms.CharField(initial='Name', label = '', max_length=50, help_text='Today date in text input.')
comment = forms.CharField(initial='Text',label ='', widget=forms.Textarea)

def clean_comment(self):
comment = self.cleaned_data['comment']
num_words = len(comment.split())
if comment != 'Text':
if num_words > 2:True
else:
raise forms.ValidationError(u'Введите Ваш Текст')
return comment

И так:

def clean_comment(self):
comment = self.cleaned_data['comment']
num_words = len(comment.split())
if comment == 'Text' or num_words > 2:
raise forms.ValidationError(u'Введите Ваш Текст')
return comment
Если значение поля ‘Text’ не изменилось вызывается исключение и валидация не проходит! Нужно тоже самое для количества символов, не могу понять почему поле не проверяется на длину строки?



Отредактировано (Сен. 5, 2011 01:52:28)

Офлайн

#2 Сен. 5, 2011 09:55:05

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

Malinaizer
        if comment != 'Text':
if num_words > 2:True # Что сия конструкция означает? По факту она ничего не делает.
****
if comment == 'Text' or num_words > 2: # А тут знак сравнения, кажись не в ту сторону
raise forms.ValidationError(u'Введите Ваш Текст')
Так должно работать:
    def clean_comment(self):
comment = self.cleaned_data['comment']
num_words = len(comment.split())
if comment != 'Text' and num_words > 2:
pass
else:
raise forms.ValidationError(u'Введите Ваш Текст')
return comment
# или так:
def clean_comment(self):
comment = self.cleaned_data['comment']
num_words = len(comment.split())
if comment == 'Text' or num_words < 2:
raise forms.ValidationError(u'Введите Ваш Текст')
return comment



Отредактировано (Сен. 5, 2011 09:58:28)

Офлайн

#3 Сен. 5, 2011 15:50:08

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

 if comment != 'Text':
if num_words > 2:True # "Это я уже от без исходности начал тупить!
****
if comment == 'Text' or num_words > 2: # А тут знак сравнения, кажись не в ту сторону
raise forms.ValidationError(u'Введите Ваш Текст')
Ваши условия тоже не подходят! Задача вроде из простых, может это баг?



Отредактировано (Сен. 5, 2011 15:50:52)

Офлайн

#4 Сен. 5, 2011 16:41:38

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

Malinaizer
Ваши условия тоже не подходят! Задача вроде из простых, может это баг?
>>> # Упростим
>>> def clean_comment(comment):
... num_words = len(comment.split())
... if comment != 'Text' and num_words > 2:
... pass
... else:
... raise Exception('Введите Ваш Текст')
... return comment
>>> clean_comment('Text')
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
clean_comment('Text')
File "<pyshell#9>", line 6, in clean_comment
raise Exception('Введите Ваш Текст')
Exception: Введите Ваш Текст
>>> # OK
>>> clean_comment('Text text text')
2: 'Text text text'
>>> # OK
>>> clean_comment('buzz')
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
clean_comment('buzz')
File "<pyshell#9>", line 6, in clean_comment
raise Exception('Введите Ваш Текст')
Exception: Введите Ваш Текст
>>> # OK
Вроде работает… или я условия неправильно понял?
В чем конкретно неработаемость проявляеться?

PS:
Поигрался с формой уже - работает ведь:
>>> class F(Form):    
... name = forms.CharField(initial='Name', label = '', max_length=50, help_text='Today date in text input.')
... comment = forms.CharField(initial='Text',label ='', widget=forms.Textarea)
...
... def clean_comment(self):
... comment = self.cleaned_data['comment']
... num_words = len(comment.split())
... if comment == 'Text' or num_words < 2:
... raise forms.ValidationError(u'Введите Ваш Текст')
... return comment
>>> f = F({'name': 'Booo', 'comment': 'Burururur'})
>>> f.is_valid()
16: False
>>> for k in f.errors:
... print f.errors[k]
<ul class="errorlist"><li>Введите Ваш Текст</li></ul>
>>> f = F({'name': 'Booo', 'comment': 'Text'})
>>> f.is_valid()
17: False
>>> f = F({'name': 'Booo', 'comment': 'Burururur bumbum'})
>>> f.is_valid()
18: True



Отредактировано (Сен. 5, 2011 16:53:56)

Офлайн

#5 Сен. 5, 2011 16:54:57

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

В том что он в форма не проходит валидацию даже если условия верны постоянный ‘Введите Ваш Текст’! хотя по отдельности каждое условие работает нормально!



Офлайн

#6 Сен. 5, 2011 17:48:43

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

Может дело в CommentForm? Я пытаюсь дополнит условия проверки!



Офлайн

#7 Сен. 5, 2011 17:50:47

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

Собрал форму полностью (Ну почти полностью…)

class CommentMetaclass(DeclarativeFieldsMetaclass):
def __init__(cls, cls_name, cls_bases, dict):
del dict['base_fields']['email']
del dict['base_fields']['url']
super(CommentMetaclass, cls).__init__(cls_name, cls_bases, dict)
class MyCommentForm(CommentForm):
__metaclass__ = CommentMetaclass
name = forms.CharField(initial='Name', label = '', max_length=50)
comment = forms.CharField(initial='Text',label ='', widget=forms.Textarea)

def clean_comment(self):
comment = self.cleaned_data['comment']
num_words = len(comment.split())
if comment == 'Text' or num_words < 2:
raise forms.ValidationError(u'Введите Ваш Текст')
return comment
*****************
>>> f = MyCommentForm(v, {'name':'Guido', 'comment':'Test text Ok'}) # v - что-бы не ругалось на отсутствие target_object
>>> f.errors
8: {'content_type': [u'This field is required.'],
'object_pk': [u'This field is required.'],
'security_hash': [u'This field is required.'],
'timestamp': [u'This field is required.']}
# ошибки по полю comment нет.
Ответственно заявляю - ошибка не в форме (Ну по крайней мере не в clean_comment()). Ищите где-то еще…



Отредактировано (Сен. 5, 2011 17:52:30)

Офлайн

#8 Сен. 5, 2011 18:16:51

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

from my_comments.forms import*
>>> f = MyCommentForm(v, {'name':'Guido', ‘comment’:'Test text Ok'})
Traceback (most recent call last):
File “<console>”, line 1, in <module>
NameError: name ‘v’ is not defined

Хочу проверить в джанго шелле но получаю ошибку что не так делаю?



Офлайн

#9 Сен. 5, 2011 18:34:52

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

По ходу дело выяснилось что и по длине не работает!

def clean_comment(self):
comment = self.cleaned_data['comment']
num_words = len(comment.split())
if num_words < 2:
raise forms.ValidationError('проверка')
return comment



Офлайн

#10 Сен. 5, 2011 19:20:12

Malinaizer
От:
Зарегистрирован: 2009-03-28
Сообщения: 133
Репутация: +  0  -
Профиль   Отправить e-mail  

Праверка двух условий в Форме

Я прошу у Вас тысяча извинений, проблена с моей головой, перепутал split с join!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version