unknown
unknown

Reputation: 331

Why the form is invalid at FormView?

All fields are filled. But for some reason does not go into the form_valid method, but it goes into form_invalid. Why form is invalid?

forms.py

class CreditFilterForm(forms.Form):
    CURRENCY_CHOICES = (
        ('KZT', _('KZT')),
        ('USD', _('USD')),
    )

    PERIOD_CHOICES = (
        ('1', _('One year')),
        ('2', _('Two')),
        ('3', _('Three'))
    )

    sum = forms.CharField(widget=forms.NumberInput(attrs={'id': "sum", 'class':"forminput-text"}))
    currency = forms.ChoiceField(choices = CURRENCY_CHOICES, widget=forms.Select(attrs={'name': "minbeds", 'id':"currency"}))
    term = forms.ChoiceField(choices = PERIOD_CHOICES, widget=forms.Select(attrs={'id':"term", 'name': "minbeds"}))

views.py

class CreditsList(ListView):
    model = Credit
    template_name = 'credits/credit_listing.html'

    def get(self, request, *args, **kwargs):
        self.object_list = self.get_queryset()
        little_form = CreditFilterForm(self.request.GET or None, prefix="little")
        ...

class LittleForm(FormView):
    form_class = CreditFilterForm

template

<form action="{% url 'little_form' %}" method="post">
    {% csrf_token %}
    {{ little_form.as_p }}
    <input type="submit" name="{{ little_form.prefix }}" value="Submit">
</form>

Upvotes: 1

Views: 129

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477607

The prefix is applied to all form input widgets. But in your LittleForm view, you did not use that prefix.

You can add it by overriding the prefix attribute [Django-doc]:

class LittleForm(FormView):
    form_class = CreditFilterForm
    prefix = 'little'

Note: I advice to rename LittleForm to LittleFormView. It makes it more clear what that class is, and it will avoid a "collision" if you later construct a form with the same name.

Upvotes: 2

Related Questions