Проверка пользовательской формы Django - PullRequest
0 голосов
/ 12 сентября 2010

В Django / Python, когда вы создаете пользовательскую форму, должен ли он иметь метод clean (), или вызов .is_valid () будет выполнять проверку по умолчанию?

if request.method == 'POST':
        filter = FilterForm(request.POST)
        if filter.is_valid():
            print 'Month is ' + filter.cleaned_data['month']
            print 'Type is ' + filter.cleaned_data['type']
            print 'Number is ' +filter.cleaned_data['number']
        else:
            print 'Invalid form'
            print filter.errors

«Неверная форма» печатается, но ошибки не выводятся.

class FilterForm(forms.Form):
    months = [('January','January'),
                  ('February','February'),
                  ('March','March'),
                  ('April','April'),
                  ('May','May'),
                  ('June','June'),
                  ('July','July'),
                  ('August','August'),
                  ('September','September'),
                  ('October','October'),
                  ('November','November'),
                  ('December','December'),]
    types = [('text','Text'),
                 ('call','Call'),] 

    month = forms.ChoiceField(months)
    type = forms.ChoiceField(choices=types,widget=forms.CheckboxSelectMultiple)

    def __init__(self,numbers,*args, **kwargs):
        super(FilterForm,self).__init__(*args, **kwargs)
        self.fields['number'] = forms.ChoiceField(choices=numbers)

    def clean(self):
        return self.cleaned_data

Я пробовал с чистым методом и без него.

Ответы [ 2 ]

3 голосов
/ 12 сентября 2010

Если у вас нет конкретного метода clean, Django все равно проверит все поля в вашей форме, чтобы убедиться, что все обязательные поля присутствуют, что они имеют правильный тип, где это необходимо, и что поля с вариантами выбора имеют значение, соответствующеек одному из вариантов.

Есть несколько проблем с этой формой, которые могут быть причиной вашей проблемы.Во-первых, вы переопределили __init__, чтобы первый параметр после self был numbers.Однако, когда вы создаете экземпляр формы, вы не передаете этот параметр - вы просто передаете request.POST.

Во-вторых, плохая идея динамически добавлять поля к self.fields, как вы делаете в __init__.Вместо этого объявите ваше поле number с пустым списком choices и просто установите его в __init__:

self.fields['number'].choices = numbers
3 голосов
/ 12 сентября 2010

нужен ли метод clean ()

Нет. Полностью необязательно.

Существует большой список вещей, которые Django делает в определенном порядке, когда проверяет формы. Вы можете узнать о процессе здесь:

http://docs.djangoproject.com/en/dev/ref/forms/validation/

Что касается поиска вашей проблемы, если вы добавите {{form.errors}} в свой шаблон, вы увидите, какое поле взрывается. У меня такое ощущение, что ваш выбор может быть определен в месте, где что-то не может сработать, когда это необходимо (уберите их из класса).

Редактировать: Почти пропустил это. Посмотрите на эту строку:

def __init__(self,numbers,*args, **kwargs)

А затем посмотрите на эту строку:

filter = FilterForm(request.POST)

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

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