AlliDeacon
AlliDeacon

Reputation: 1495

Django ModelForm Form not Posting

I have a form that is based on a ModelForm in my forms.py. I initially get the blank form as expected, however when filling out the form and hitting submit nothing happens. I am not sure where I am going wrong.

views.py

def add_customer(request):
    # print(customer_form)
    # print(customer_form.errors)
    print(request.method)
    print(request.POST)
    customer_form = CustomerForm(request.POST or None)
    if customer_form.is_valid() and request.method == 'POST':
        form = CustomerForm(request.POST)
        form.save()
        return redirect('AdminPortal:customers')
        print('posted')
    else:
        print('failing')
        context = {'customer_form': customer_form,}
        return render(request, 'add_customer.html', context=context)

urls.py

    path("customers/", views.customers, name="customers"),
    path("customers/customer/<int:id>/", views.customer, name="customer"),
    path("add_customer/", views.add_customer, name="add_customer"),

forms.py

class CustomerForm(forms.ModelForm):
    class Meta:
        model = AppCustomerCst
        fields = ('is_active_cst', 'name_cst', 'address_1_cst', 'address_2_cst', 'address_3_cst',
                  'city_cst', 'state_cst', 'zip_cst', 'country_cst', 'salesrep_cst', 'type_cst',
                  'is_allowed_flat_cst', 'iddef_cst', 'balance_notify_cst',  'receive_emails_cst',
                  'contact_domain_cst'
                  )

add_customer.py [form portion]

    <form method="post" action='AdminPortal:add_customer'>
        {% csrf_token %}
        {{ customer_form }}
        <button type="button" value="submit">Submit</button>
        <button type="button" value="cancel">Cancel</button>

    </form>

Upvotes: 0

Views: 1068

Answers (2)

AlliDeacon
AlliDeacon

Reputation: 1495

I found my error in the HTML Template. I had:

<button type="button" value="submit">Submit</button>
<button type="button" value="cancel">Cancel</button>

Once Updated to:

        <input type="submit" value="submit">Submit</input>
        <input type="submit" value="cancel">Cancel</input>

The form posted properly as expected.

Upvotes: 1

markwalker_
markwalker_

Reputation: 12849

It looks like the form doesn't know where to post.

You need to turn it into a django url template tag. So I'd do something like this for your form;

<form method="post" action='{% url "AdminPortal:add_customer" %}'>
    {% csrf_token %}

    {% if form.non_field_errors %}
        {{ form.non_field_errors }}
    {% endif %}

    {% for hidden in form.hidden_fields %}
        {{ hidden }}
    {% endfor %}

    {% for field in form.visible_fields %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}
            {% if field.help_text %}
                <p class="help">{{ field.help_text|safe }}</p>
            {% endif %}
        </div>
    {% endfor %}

    <button type="button" value="submit">Submit</button>
    <button type="button" value="cancel">Cancel</button>
</form>

To find what's happening in your view I'd recommend simplifying the logic somewhat so that it's more inline with the docs here; https://docs.djangoproject.com/en/3.1/topics/class-based-views/intro/#handling-forms-with-class-based-views

Because you're doubling up the check for post & valid, I suspect you're never seeing the validation errors because they'd only come from that block of code. So change your view to be something like this and if you updated your template as above you should see some errors;

def add_customer(request):

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

        if form.is_valid():
            form.save()
            return redirect('AdminPortal:customers')
    else:
        form = CustomerForm()

    return render(request, 'add_customer.html', {'customer_form': form})

Upvotes: 2

Related Questions