python - Prevent repopulation and/or resubmit of Django form after using the back button -


the problem

we have following setup.

  • pretty standard django class based view (inherits createview, i'll call form on).
  • after successful post , form validation, object created, , user redirect_to'd detailview of created record.
  • some users decide not happy data entered. press button.
  • the html generated createview fetched form browser cache, , repopulated data entered.
  • to user, feels edit, change data , submit again.
  • the result 2 records, minor differences.

what have tried?

  1. at first thought post-redirect-get (prg) pattern django uses supposed prevent this. after investigating, seems prg meant prevent dreaded "do want resubmit form?" dialog. dead end.

  2. after hitting button, fetched cache, have no chance of interacting user our django code. try , prevent local caching, have decorated createview @never_cache. nothing us, page still retrieved form cache.

what considering?

we considering dirty javascript tricks onload check of window.referrer, , manual clean of form and/or notice user if referrer looks detailview mentioned earlier. of course feel totally wrong. again, semi-duplicate records in our db.

however, seems unlikely first bothered wanted ask around here on stackoverflow.

ideally, tell browser caching form big no, , browser listen. again, use @never_cache, apparently not enough. happens in chrome, safari , firefox.

looking forward insights! thanks!

maybe don't process post request when it's coming referrer other same page?

from urllib import parse  class createview(...):   def post(self, *args, **kwargs):     referer = 'http_referer' in self.request.meta , parse.urlparse(self.request.meta['http_referer'])     if referer , (referer.netloc != self.request.meta.get('http_host') or referer.path != self.request.meta.get('path_info')):       return self.get(*args, **kwargs)      ... 

Comments

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -