user7411127
user7411127

Reputation: 33

Django, form is_valid() is always false

I'm learning Django and have some troubles with forms. I try to create a simple form where I type a name and show it on another page. But is_valid() always returns false. Please, help me to find my error

forms.py

from django import forms

class OrderForm(forms.Form):
    user=forms.CharField(max_length=100)

views.py

def order(request):
    return render(request, 'myapp/order.html', {})


def contact(request):
    username='not logged'

    if request.method == 'POST' :
        form=OrderForm(request.POST)

        if form.is_valid():
            username=form.cleaned_data['username']
        else:
            username='not worked'
    else:
        form=OrderForm()

    return render(request, 'myapp/contacts.html', {'username':username})

order.html

<form name = "form" action = "{% url 'contact' %}" method = "POST" >
    {% csrf_token %}
        <input type="text" name="username" placeholder="Name">
        <button type="submit">Login</button>
</form>

contacts.html

You are : <strong>{{ username }}</strong>

Upvotes: 1

Views: 3325

Answers (2)

Peter DeGlopper
Peter DeGlopper

Reputation: 37364

Your form control has the name username in HTML, while your form's field is named user in Django. Thus, nothing is set in the form field.

Normally you'd put the form into the context and then render it either as {{ form }} or the like, or render each field, rather than build your own form controls. The docs show how: https://docs.djangoproject.com/en/1.10/topics/forms/#working-with-form-templates

Upvotes: 3

shuboy2014
shuboy2014

Reputation: 1370

views.py

    from forms import OrderForm
    def order(request):
        form = OrderForm()
        return render(request, 'myapp/order.html', {"form" : form})

order.html

<form name = "form" action = "{% url 'contact' %}" method = "POST" >
    {% csrf_token %}
        {{form.as_p}}
        <button type="submit">Login</button>
</form>

At the time of rendering template {{form.as_p}} looks like

<p><label for="id_username">Username:</label>
    <input id="id_username" type="text" name="username" maxlength="100" required /></p>

Upvotes: 0

Related Questions