英文:
Render a template upon failed POST request [golang]
问题
我想处理一个POST请求的错误,并重新渲染带有错误信息的表单,但是我看到的处理错误的唯一解决方案是使用http.Error(),但这只返回纯文本响应,而不是HTML页面。有没有办法使用executeTemplate()重新渲染带有表单的HTML页面?我应该将用户重定向到同一个页面吗?如果是这样,我如何将错误信息传递给重定向的页面?
编辑:所以,当我使用这段代码并尝试执行executeTemplate时,POST请求返回了一个错误的200状态码,并重新渲染了一个空白页面,而不是我指定的模板。
func PostSignup(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
if r.Method != http.MethodPost {
http.Error(w, http.StatusText(405), http.StatusMethodNotAllowed)
return
}
usr := users.User{}
usr.Username = r.FormValue("username")
usr.Email = r.FormValue("email")
usr.Hash = r.FormValue("password")
errors := CredErrors{}
errors.Error = "Username cannot be blank"
if usr.Username == "" {
// http.Error(w, "Username cannot be blank.", 400)
tpl.ExecuteTemplate(w, "signup.gothml", errors)
return
}
以上是您提供的代码。
英文:
I want to handle the errors of a POST request and re-render the form with the errors displayed above it, but the only solution to handling errors I see is http.Error() but this returns a plaintext response, not an HTML page. Is there a way to executeTemplate() and re-render the html page with the form? Am I supposed to redirect the user to the same page? If so, how do I pass the error information to that redirected page?
Edit: So, when I use this code, and try to executeTemplate, the Post request returns a 200 status code (which is wrong) and it re-renders blank page, not the template I specified.
func PostSignup(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {
if r.Method != http.MethodPost {
http.Error(w, http.StatusText(405), http.StatusMethodNotAllowed)
return
}
usr := users.User{}
usr.Username = r.FormValue("username")
usr.Email = r.FormValue("email")
usr.Hash = r.FormValue("password")
errors := CredErrors{}
errors.Error = "Username cannot be blank"
if usr.Username == "" {
// http.Error(w, "Username cannot be blank.", 400)
tpl.ExecuteTemplate(w, "signup.gothml", errors)
return
}
答案1
得分: 0
答案就在问题中:
> 有没有一种方法可以使用executeTemplate()
重新渲染带有表单的HTML页面?
是的,使用executeTemplate
来重新渲染表单。http.Error()
用于返回HTTP错误,而不是表单验证错误。如果表单验证失败并且您想要重新显示它,只需这样做-再次将表单渲染到浏览器中,包括您想要显示的任何验证错误/预填充/其他内容。
英文:
The answer is in the question:
> Is there a way to executeTemplate() and re-render the html page with the form?
Yes, use executeTemplate
to re-render the form. http.Error()
is for returning HTTP errors, not form validation errors. If the form fails validation and you want to redisplay it, do just that - render the form out to the browser again, with whatever validation errors/prepopulation/whatever you want to display.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论