在我的 django 项目的 chrome 浏览器中按回“确认表单重新提交”

Posted

技术标签:

【中文标题】在我的 django 项目的 chrome 浏览器中按回“确认表单重新提交”【英文标题】:"Confirm Form Resubmission " on pressing back in the chrome browser in my django project 【发布时间】:2021-07-17 06:45:29 【问题描述】:

这是我的第一个 Web 开发项目。它基本上是一个电子投票网站。索引页面是登录页面。因此,当用户使用有效凭据登录时,网站会将用户带到投票页面,其中包含投票表格和导航栏中的一些其他选项,如反馈、新闻更新等。登录请求是“POST”。投票提交请求也是“POST”。在这里,如果用户按下其他选项,例如提交反馈或查看候选人,则会将用户带到相应的页面。如果用户按下返回按钮,网站应该再次将他带到投票页面,在那里他可以再次使用其他设施投票、查看候选人或提交反馈。但我面临的问题是,如果用户从第三页(即反馈页面或查看候选人页面)按下后退按钮,则会显示错误“确认表单重新提交”。帮我修复这个错误。提前谢谢你。

views.py

from django.shortcuts import render,redirect
from django.contrib.auth.models import User, auth
from django.contrib import messages
from .models import voteoption,receive,received_feedback,updates

# Create your views here.
def index(request):
    return render(request,"index.html")

def login(request):
    
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']

        user = auth.authenticate(username=username,password=password)

        if user is not None:
            auth.login(request, user)
            cand = voteoption.objects.all()
            return render(request,"votepage.html", 'candidates': cand)
        else:
            messages.info(request,'Invalid Email or Password')
            return render(request,'index.html')
    else:

        return render(request,'index.html')

def logout(request):
    auth.logout(request)
    return redirect("/")

def update(request):
    news = updates.objects.all()
    return render(request,'updates.html', 'upd': news)

def contact(request):
    return render(request,'contact.html')

def feedback(request):
    return render(request,'feedback.html')

def feedbacksubmit(request):
    feedback = request.POST['feedback']
    data = received_feedback(response=feedback)
    data.save()
    messages.info(request,'Feedback Submitted Successfully')
    return render(request,'submitted.html')

def candidates(request):
    cand = voteoption.objects.all()
    return render(request,'candidates.html','candidates': cand )

def submitvote(request):
    reg_no = request.POST['reg_no']
    selection = request.POST['selection'] 
    voter = request.POST['voter']

    if receive.objects.filter(mail=voter).exists():
        messages.info(request,'You have already Voted')
        return render(request,'submitted.html')
    else:
        data = receive(reg_no=reg_no,selection=selection,mail=voter)
        data.save()
        messages.info(request,'You have voted Successfully. Thank You!')
        return render(request,'submitted.html')

我应该做哪些改变?

由于这是我的第一个项目,可能会有很多糟糕的编码技术。因此,请建议我使用更好的代码来替换我的代码,即使它与此错误无关。

【问题讨论】:

确保您遵循了有关表单的教程。 【参考方案1】:

您将希望使用Post/Redirect/Get 模式处理成功的表单提交,以防止后退按钮返回到上一个帖子。在您的 Django 项目中,这是通过从视图返回 redirect 而不是 HttpResponse 来完成的。 Redirect docs

from django.shortcuts import redirect

def view_function(request, ...):
    ... # code processing the POST
    if post_request_successful:
        return redirect(path)
    else:
        return HttpResponse(...)  # or render(...) or whatever you usually return

path 是一个网址。您很可能希望在请求 request.path 中使用相同的路径,或者通过从 urls.py 文件 (from django.shortcuts import reverse) 中反转 url 名称来获取路径。 Reverse docs

【讨论】:

我已经添加了我的项目文件。你能帮我解决我应该做的改变吗? 好吧,就像我在回答中所说的那样,在您成功处理 POST 请求的视图函数中的任何地方,而不是返回 render(...) 您想要 return redirect(request.path)return redirect(reverse(url_name)) 和 @ 987654333@ 是您在 urls.py 中的网址名称之一。 非常感谢。你已经解决了我的错误。

以上是关于在我的 django 项目的 chrome 浏览器中按回“确认表单重新提交”的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 Chrome / Firefox 浏览器中查看 SQLite 数据库?

为啥我的网站在我滚动时在 Chrome 中显示滞后?

(Django) AJAX 请求的 CSRF 验证在 Chrome 而不是 Firefox 中工作

我的 API url 在 Chrome 浏览器中有效,但在我的测试 apache 本地主机环境中无效

我无法在我的项目中使用 Angular 材料 [重复]

在我的网站上禁用 Chrome 翻译栏