Nikolai0045
Nikolai0045

Reputation: 31

Django form won't bind to POST data

I am really struggling trying to get my POST data to bind to this form. POST data is coming through properly and appears to be in the right form, but it absolutely refuses to bind to the form for validation. I'm new to this so I'm sure I'm missing something obvious, but any help figuring out why this is happening would be greatly appreciated.

views.py
def new_call(request):

    if not request.user.is_authenticated():
        return redirect(login_view)

    if request.method == "POST":    

        form = RegisterCallForm(request.POST,user=request.user)

        #Prints False
        print form.is_bound

        if form.is_valid():
            answered = form.cleaned_data['answered']
            left_message = form.cleaned_data['left_message']
            contact_pk = form.cleaned_data['contact']
            time_called = form.cleaned_data['time_called']
            note = form.cleaned_data['note']

            staff_person = request.user.userprofile

            call = Call(
                staff_person=staff_person,
                contact=contact,
                answered=answered,
                left_message=left_message,
                time=time_called,
                note=note,
                )

            call.save()

            if request.POST.get('submit') == 'continue':
                return redirect(user_profile_view)
            else:
                return redirect(new_call)

    else:

        form = RegisterCallForm(user=request.user,)

    return render(request, 'supporttracker/register_call.html',{'form':form})

And here's the form...

forms.py
class RegisterCallForm(forms.Form):

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

        self.user = kwargs.pop('user',User)
        super (RegisterCallForm, self).__init__(*args,**kwargs)

        self.fields['contact'] = forms.TypedChoiceField(
        choices = get_contact_list(self.user),
        label = 'Call with',
        )

        new_fields = OrderedDict()

        new_fields['contact'] = self.fields['contact']
        new_fields['answered'] = self.fields['answered']
        new_fields['left_message'] = self.fields['left_message']
        new_fields['time_called'] = self.fields['time_called']
        new_fields['note'] = self.fields['note']

        self.fields = new_fields

    answered = forms.TypedChoiceField(
    label='Answered:',
    coerce=lambda x: x == 'Yes',
    choices=((False, 'No'), (True, 'Yes')),
    widget=forms.RadioSelect
    )   

    left_message = forms.TypedChoiceField(
    label='Left a message:',
    coerce=lambda x: x == 'Yes',
    choices=((False, 'No'), (True, 'Yes')),
    widget=forms.RadioSelect
    )

    time_called = forms.DateTimeField(
    label = 'Time of call',
    initial = datetime.datetime.now,
    required = False,
    )

    note = forms.CharField(
    max_length=500,
    widget=forms.Textarea,
    required=False,
    )

Upvotes: 1

Views: 814

Answers (1)

Ali Nikneshan
Ali Nikneshan

Reputation: 3502

It seems you forget to call super init. How do you expect form class do it's normal job when you override the init function?

Upvotes: 1

Related Questions