You are POSTing to /testimonials/thanks/
which should be changed to your add_testimonial
route to have your view handle the POST. So, the solution is to change the action
value in your template's form tag.
If you can post the relevant code from your urls.py I can provide a more specific answer as to what the value of the action attribute should be.
Update
The redirect will happen in your view when a valid form is POSTed. Change your template's action attribute value to:
<form id="testimonial_form" method="POST" action="{% url 'add_testimonial' %}">
In your view:
if form.is_valid():
form.save()
return HttpResponseRedirect(reverse('testimonial_thanks'))
And make sure you include the following import in your view:
from django.core.urlresolvers import reverse
Update 2
Display your form errors in your template:
<form id="testimonial_form" method="POST" action="{% url 'add_testimonial' %}">
{% csrf_token %}
{% if form.non_field_errors %}
<div class="form-group text-error">
{{ form.non_field_errors }}
</div>
{% endif %}
{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}
{% for field in form.visible_fields %}
{{ field.help_text}}
{{ field }}
{% if field.errors %}
<span>{{ field.errors|striptags }}</span>
{% endif %}
{% endfor %}
<input type="submit" name="submit" value="Add testimonial" class="btn btn-info test-button"/>
</form>
Update 3
Now that you can see your form errors, you will need to provide your default value to the hidden field, and there's no need to make it a ChoiceField if the user has no choice (it's hidden!). So change the verified
form field to:
verified = forms.CharField(widget=forms.HiddenInput(), initial='no')
Also, it would be a good idea to verify the value in your view since even though the field is hidden, an enterprising, evil user can still POST other values.