【问题标题】:Flask redirect is not working, no error, and db isn't updatedFlask 重定向不起作用,没有错误,并且 db 没有更新
【发布时间】:2021-08-19 10:50:30
【问题描述】:

提交表单时,页面未重定向。没有错误;一些信息被添加到 url,就是这样。之后数据库不会更新。

`from regist import app
from flask import render_template, redirect, url_for
from regist.models import Applicant
from regist.forms import RegisterForm
from regist import db

@app.route('/')
def index():
    return render_template('index.html') 

@app.route('/redirected')
def redirected():
      return render_template('page.html')      

@app.route('/join', methods=['GET','POST'])
def join():
    form=RegisterForm()
    if form.validate_on_submit():
          applicant_to_create=Applicant(name=form.name.data,
                                        surname=form.surname.data,
                                        gender=form.gender.data,
                                        dateOfBirth=form.dateOfBirth.data,
                                        address=form.address.data,
                                        qualifications=form.qualifications.data,
                                        email=form.email.data,
                                        phoneNumber=form.phoneNumber.data)  
          db.session.add(applicant_to_create)
          db.session.commit()   
          return redirect(url_for('redirected'))                     
    return render_template('join.html',form=form)  `

初始网址为:“http://127.0.0.1:5000/join”

After adding some dummy data, it becomes: "http://127.0.0.1:5000/join?search=+%28ru%28rzshrhf&csrf_token=ImIwZWIwODcyNWQ4MWNkYjNjYWJkNjE5NTNkY2MwZWE5Yzk4MjNkOTci.YR4veQ.eyoXQWv4kRShFiZMEbPXoWzsbL0&name=dhss&surname=sdh&gender=M&dateOfBirth=sdthdh&address=dshtes&qualifications=dshdh&email =dhr&phoneNumber=dshd&提交=提交" 我故意将日期字段设置为接受文本。

这里是表单的html代码:

 {%extends 'layout.html' %}
{%block head%}
<title>form</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/formstyle.css') }}">
{%endblock%}

{%block body%}
<body> 
    
        <h2>Join Us</h2>
        <span id="requiredFieldMessage">fields marked (*) are required</span>
        <form method="POST">
        <!--{{ form.hidden_tag() }}-->  
        <table id="formTable">
            <tr><td class="labelCell">{{ form.name.label()}}</td>   <td class="labelCell">{{ form.surname.label()}}</td></tr>   
            <tr><td>{{ form.name(class="textbox") }}</td><td>{{ form.surname(class="textbox") }}</td></tr>  
            <tr><td class="labelCell">{{ form.gender.label()}}</td> <td class="labelCell">{{ form.dateOfBirth.label()}}</td></tr>   
            <tr><td>{{ form.gender() }}</td>    <td>{{ form.dateOfBirth(class="textbox", placeholder="dd-mm-yyyy") }}</td></tr> 
            <tr><td class="labelCell">{{ form.address.label()}}</td>    <td class="labelCell">{{ form.qualifications.label()}}</td></tr>    
            <tr><td>{{ form.address(class="textbox", rows="5", cols="40", placeholder="Enter four or five line address") }}</td>    <td>{{ form.qualifications(class="textbox", rows="5", cols="40", placeholder="enter at least one certificate") }}</td></tr> 
            <tr><td class="labelCell">{{ form.email.label()}}</td>  <td class="labelCell">{{ form.phoneNumber.label()}}</td></tr>   
            <tr><td>{{ form.email(class="textbox") }}</td>  <td>{{ form.phoneNumber(class="textbox") }}</td></tr>   
            <tr colspan="2"><td><br>{{ form.submit(id="submitButton") }}<br></td></tr>
        </table>
        </form>
{%endblock%}

【问题讨论】:

  • 请出示您的html模板代码
  • 您的表单似乎没有正确的目标并且它不是发布操作。正如 gittert 所说,错误在 html 中而不是在您的 python 代码中。

标签: python flask flask-sqlalchemy flask-wtforms


【解决方案1】:

假设您使用的是 Flask-WTF。 看看文档中关于 validate_on_submit 的说法:

请注意,您不必将 request.form 传递给 Flask-WTF;它会 自动加载。方便的 validate_on_submit 将检查 如果它是 POST 请求并且它是否有效。

Source

(重点是我的)

您的表单应该以 POST 的形式提交,而不是 GET。 GET 表单很少见(主要是搜索表单,因为关键字在 URL 中传播,因此可以共享或收藏查询)

这里似乎发生了if form.validate_on_submit(): 条件不正确。将表单修复为使用 POST 后,如果该条件失败,您应该向用户显示错误消息,然后要求他们更正输入,而不是执行静默重定向。表单没有按应有的方式执行验证,并且在发生错误时没有传达清晰的反馈,这是非常令人恼火的......

您需要做的就是在 if 中添加一个 else 子句,并显示应该已经可以从 Flask WTF 获得的错误消息。构建表单时,对其进行测试并确保它不接受垃圾。

【讨论】:

  • 我在 html 中为我的表单设置了 post 方法。我只是用它编辑了原始问题。除非我不明白你所说的“作为帖子提交”是什么意思
  • 我建议您在表单中添加一个 target,以明确说明数据应提交到的位置。 &lt;form method="POST" target="{{ url_for('join') }}"&gt; 之类的东西应该足够了 现在,我不知道它的去向,但可能不是你认为应该去的地方。
猜你喜欢
  • 2021-03-09
  • 2019-02-16
  • 2016-11-21
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多