kpk
kpk

Reputation: 119

Django : request.POST error "__init__() takes 1 positional argument but 2 were given"

I have a simple form in my Django project:

forms.py

class DamageListCriteria(forms.Form):
    fromdate = forms.CharField(widget=forms.widgets.DateTimeInput(attrs={'type': 'datetime-local'}))
    todate = forms.CharField(widget=forms.widgets.DateTimeInput(attrs={'type': 'datetime-local'}))

class Meta:
    fields = ['fromdate','todate']

views.py

class DamageListCriteria(TemplateView):
template_name = "damage/damagelist_criteria.html"

def get(self, request):
    form = DamageListCriteria()
    general = General.objects.get(pk=1)
    args = {
        'form': form,
        'general': general
    }
    return render(request, self.template_name, args)

def post(self, request):
    general = General.objects.get(pk=1)
    form = DamageListCriteria(request.POST)

    args = {
           'form': form,
           'general': general
           }
    return render(request, self.template_name, args)

urls.py

url(r'damage/list/criteria/$', views.DamageListCriteria.as_view(), name="damage-list-criteria"),

when I try to post I am getting this error : '__init__() takes 1 positional argument but 2 were given'

the error is on the form = DamageListCriteria(request.POST) line of code.

Thanks in advance for your time

Upvotes: 0

Views: 175

Answers (2)

JPG
JPG

Reputation: 88639

This is because you defined your form class and view class with the same name. So change the class name of either view or form class.

or change your respective files as below,

forms.py(Changed form class name to DamageListCriteriaForm)

class DamageListCriteriaForm(forms.Form):
    fromdate = forms.CharField(widget=forms.widgets.DateTimeInput(attrs={'type': 'datetime-local'}))
    todate = forms.CharField(widget=forms.widgets.DateTimeInput(attrs={'type': 'datetime-local'}))

    class Meta:
        fields = ['fromdate', 'todate']


views.py (changed the references of form class)

class DamageListCriteria(TemplateView):
    template_name = "damage/damagelist_criteria.html"

    def get(self, request):
        form = DamageListCriteriaForm()
        general = General.objects.get(pk=1)
        args = {
            'form': form,
            'general': general
        }
        return render(request, self.template_name, args)

    def post(self, request):
        general = General.objects.get(pk=1)
        form = DamageListCriteriaForm(request.POST)

        args = {
            'form': form,
            'general': general
        }
        return render(request, self.template_name, args)

Upvotes: 2

Kiro
Kiro

Reputation: 949

You redefined your DamageListCriteria class in views.py. So, you're trying to instantiate your view class, instead of form.

Try changing your view name to DamageListCriteriaView, or/and form to DamageListCriteriaForm.

Upvotes: 0

Related Questions