Ошибка проверки форм Django - объект TypeError 'str' не вызывается - PullRequest
0 голосов
/ 17 октября 2010

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

У меня есть этот код для формы:

class CTAForm(forms.Form):      
    first_name = forms.CharField(max_length=50)
    email = forms.EmailField()
    phone = forms.CharField(max_length=15, required=False, label='Phone (optional)')

Ия делаю этот вызов где-то в представлении для обработки данных формы.

if cta_form.is_valid():

, и я получаю:

Exception Type:     TypeError
Exception Value:    'str' object is not callable
Exception Location:     /usr/lib/pymodules/python2.6/django/forms/forms.py in full_clean, line 246

Трассировка показывает это:

/ usr / lib / pymodules / python2.6 / django / forms / forms.py в full_clean:

  1. за исключением ValidationError, e:
  2. self._errors [name] = self.error_class (e.messages) ...

▼ Локальные переменные
Значение переменной
e: ValidationError ()
поле: django.forms.fields.EmailField объект в <0x225c4d0c>
name: 'email'
self: blah.views.CTAForm объект в <0x2245b42c>
value: u ''

Я чувствую себя довольно глупо.Кто-нибудь дает мне руководство по этому вопросу?спасибо.


редактировать: более полный код представления в соответствии с запросом

def cta_add(request):
    context_dict = {'categories': Category.objects.all().order_by('order'),}
    # we always expect to receive data via post
    if request.method =='POST':
        # get the current vid based on the parameter        
        current_vid = Video.objects.get(slug=request.POST['current_vid'])           
        # use this video to create our dynamic form so we get the valid cta values based on that video
        cta_form_class = make_cta_form(current_vid.cta_set.all().order_by('order'))
        # instantiate our new dynamic form based on the post data
        cta_form = cta_form_class(request.POST,  error_class='error')

        # if we got this far, we were able to generate a form to validate the user's input against.
        # If form validates, than process and take user to success screen           
        if cta_form.is_valid():

вспомогательная функция make_cta_form ниже

def make_cta_form(cta_set):
    cta_list =[]
    if not cta_set is None:
        for cta in cta_set:
            cta_list.append((cta.text, cta.text))

    class CTAForm(forms.Form):
        cta = forms.MultipleChoiceField(widget=forms.CheckboxSelectMultiple, choices=cta_list, label='', required=False)
        first_name = forms.CharField(max_length=50)
        email = forms.EmailField()
        phone = forms.CharField(max_length=15, required=False, label='Phone (optional)')        

    return CTAForm

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Вы получаете сообщение об ошибке, что строка не может быть вызвана, но ваш класс ошибок для формы - это строка, а не класс ошибок.

    cta_form = cta_form_class(request.POST,  error_class='error')

Теперь единственная ссылка в документации, которую я могу найти для error_class, это список строк, так что вы можете просто попробовать

    cta_form = cta_form_class(request.POST,  error_class=['error'])

Хотя, кажется, имеет смысл сделать что-то вроде

    import forms 
    [...]
    cta_form = cta_form_class(request.POST,  error_class=forms.ValidationError("error"))

или, возможно:

    cta_form = cta_form_class(request.POST,  error_class=forms.ValidationError)
0 голосов
/ 17 октября 2010

В вашем views.py файле.Когда вы получаете форму (после того, как пользователь заполняет).Это то, что вы делаете?

from your_app.forms import *

def process_form(request):
    cta_form = CTAForm(request.POST)

    if cta_form.is_valid():
        # your code.

Вам нужно передать POST для вашей формы в качестве инициализатора для конструктора.

...