62
My guess is that this is a problem in your view.
After successful submission and processing of a web form, you need to use a return HttpResponseRedirect, even if you are only redirecting to the same view. Otherwise, certain browsers (Iโm pretty sure FireFox does this) will end up submitting the form twice.
Hereโs an example of how to handle thisโฆ
def some_view(request):
if request.method == "POST":
form = some_form(request.POST)
if form.is_valid():
# do processing
# save model, etc.
return HttpResponseRedirect("/some/url/")
return render_to_response("normal/template.html", {"form":form}, context_instance=RequestContext(request))
Given your recently added view aboveโฆ
def index(request):
shouts = Shout.objects.all()
if request.method == "POST":
form = GuestBookForm(request.POST)
if form.is_valid():
cd = form.cleaned_data
shout = Shout(author = cd['author'], message = cd['message'])
shout.save()
# Redirect to THIS view, assuming it lives in 'some app'
return HttpResponseRedirect(reverse("some_app.views.index"))
else:
form = GuestBookForm()
return render_to_response('guestbook/index.html', {'shouts' : shouts,
'form' : form },
context_instance = RequestContext(request))
That will use reverse to redirect to this same view (if thats what you are trying to do)
6
Try:
return redirect ('url', parameter_if_needed)
instead of
return render (request, 'name.hmtl', context)
In my case it works perfectly.
- [Django]-Serving gzipped content from django
- [Django]-Django 1.7 โ App 'your_app_name' does not have migrations
- [Django]-How to get all users of a group in Django?
3
Most likely: When you refresh after submitting the form, you are showing the same form page again (without doing anything). You either need to redirect to the record page or a new page after the form has been submitted.
That way, the form becomes empty its data and will not resubmit when you refresh.
- [Django]-How to express a One-To-Many relationship in Django?
- [Django]-Django forms, inheritance and order of form fields
- [Django]-How do I package a python application to make it pip-installable?
1
This solution worked for me. After form submission we have have to display a message in our template in form of popup or text in any form so though HttpResponseRedirect may prevent form resubmission but it wonโt deliver the message so here is what I did.
from django.contrib import messages
def index_function(request):
if request.method == "POST":
form = some_form(request.POST)
if form.is_valid():
# do processing
# save model, etc.
messages.success(request, 'Form successfully submitted') # Any message you wish
return HttpResponseRedirect("/url")
Then inside your template, you can show this message. Since this is global parameter you can display it in any HTML template like the following.
{% if messages %}
<div class="alert alert-success alert-dismissible">
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
</div>
{% endif %}
- [Django]-Docker/Kubernetes + Gunicorn/Celery โ Multiple Workers vs Replicas?
- [Django]-Django Order By Date, but have "None" at end?
- [Django]-What is an efficient way of inserting thousands of records into an SQLite table using Django?
1
I have found a way and I think itโs going to work for any website. what you have to do is add a Htmx cdn or you can call the javascript library from htmx.org like bootstrap CDN.
add this
before body tag
<script src="https://unpkg.com/htmx.org@1.6.0"></script>
add this or go to their website htmx.org
then what you have to do is go to your form tag and add thisโฆ.
hx-post=" then add the path in here, where you want to redirect"
something like this..
contact html
<form hx-post="/contact" hx-target="body" method="post">
</form>
you have to add a target depending on your form type. The above example is a contact form I want that contact form to stay on the same page and target its body like this hx-target="body"
views.py
return render(request, "blog/contact.html")
- [Django]-Django-tables2: How to use accessor to bring in foreign columns?
- [Django]-How to pull a random record using Django's ORM?
- [Django]-Images from ImageField in Django don't load in template
0
Use HttpResponseRedirect
create a new view(lets say thank_you
) for successful message to display after form submission and return a template.
After successful form submission do return HttpResponseRedirect(โ/thank-you/โ) to the new thank-you view
from django.http import HttpResponseRedirect
def thank_you(request, template_name='thank-you.html'):
return render_to_response(template_name,locals(),context_instance=RequestContext(request))
and in urls.py
url(r'^thank-you/$','thank_you', name="thank_you")
Multiple form submission happens because when page refreshes that same url hits, which call that same view again and again and hence multiple entries saved in database. To prevent this, we are required to redirect the response to the new url/view, so that next time page refreshes it will hit that new url/view.
- [Django]-How to use 'select_related' with get_object_or_404?
- [Django]-ImproperlyConfigured: You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings
- [Django]-Django serializer inherit and extend fields