【问题标题】:FLASK PYTHON: Submitting a flask form not workingFLASK PYTHON:提交烧瓶表单不起作用
【发布时间】:2022-01-09 15:20:25
【问题描述】:

我正在尝试使用 Flask 制作上传表单,用户需要填写所需信息,上传照片,并使用 QuerySelectField 从数据库中选择提供的类别。

当我提交表单时,没有任何反应。它将我重定向到同一页面,并且数据库为空。

form.py

class UploadForm(FlaskForm):
title = StringField(label='Title:', validators=[DataRequired(), Length(min=2, max=30)])
organizer = StringField(label='Name:', validators=[DataRequired(), Length(min=2, max=30)],
                        render_kw={'readonly': True})
type = QuerySelectField(query_factory=choice_query, allow_blank=False, get_label='name')
description = StringField(label='description',validators=[DataRequired(), Length(min=1, max=250)])
address = StringField(label='address',validators=[DataRequired(), Length(min=1, max=50)])
file = FileField(label='file', validators=[DataRequired()])
price = IntegerField(label='Price:', validators=[DataRequired(), NumberRange(min=1, max=10)])
upload = SubmitField(label='Post')

model.py

class Event(db.Model):
__tablename__ = "event"
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(30), nullable=False)
price = db.Column(db.Integer(), nullable=False)
location = db.Column(db.String(50), nullable=False)
description = db.Column(db.String(1024), nullable=True, unique=True)
date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
type = db.Column(db.Integer(), db.ForeignKey('category.id'), nullable=False)
image_file = db.Column(db.String(20), nullable=True, default='default.jpg')
owner = db.Column(db.Integer(), db.ForeignKey('eventowners.id'), nullable=False)
reserver = db.relationship('Reservation', foreign_keys=[Reservation.reserved_id],
                           backref=db.backref('reserved', lazy='joined'), lazy='dynamic',
                           cascade='all, delete-orphan')



class Choice(db.Model):
__tablename__ = "category"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(20), nullable=False)
event = db.relationship('Event', backref='events', lazy=True)

def __repr__(self):
    return '[Choice {}]'.format(self.name)

class EventOwner(db.Model, UserMixin, USER):
__tablename__ = 'eventowners'
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
sub_type = db.Column(db.String, nullable=True, default=00)
events = db.relationship('Event', backref='eventowner', lazy=True)
follower = db.relationship('Follow', foreign_keys=[Follow.followed_id],
                           backref=db.backref('followed', lazy='joined'), lazy='dynamic',
                           cascade='all, delete-orphan')

routes.py

@app.route('/event/new', methods=['GET', 'POST'])
@login_required
def post_events():
    if not os.path.exists('static/' + str(session.get('id'))):
       os.makedirs('static/' + str(session.get('id')))
    file_url = os.listdir('static/' + str(session.get('id')))
    file_url = [str(session.get('id')) + "/" +
                 file for file in file_url]
    formupload = UploadForm()
    eventowner = current_user.id
    formupload.organizer.data = eventowner
    event = Event(owner=formupload.organizer.data)
    if formupload.validate_on_submit():
       event = Event(title=formupload.title.data,
                  type=formupload.type.data,
                  description=formupload.description.data,
                  price=formupload.price.data,
                  location=formupload.address.data,
                  image_file=photos.save(formupload.file.data,
                                         name=str(session.get('id')) + '.jpg',))

      db.session.add(event)
      db.session.commit()
      flash('Event Posted!')
      return redirect(url_for('events_page'))
    return render_template('post_event.html', formupload=formupload, event=event)

@app.route('/event', methods=['GET', 'POST'])
def events_page():
    event = Event.query.order_by(Event.date_posted.desc()).all()
    page = request.args.get('page', 1, type=int)
    show_followed = False
    if current_user.is_authenticated:
        show_followed = bool(request.cookies.get('show_followed', ''))
    if show_followed:
        query = current_user.followed_posts
    else:
        query = Event.query
    pagination = Event.query.order_by(Event.date_posted.desc()).paginate(page,
                                                                         per_page=
                                                                         current_app.config['FLASKY_POSTS_PER_PAGE'],
                                                                         error_out=False
                                                                         )
    events = pagination.items
    return render_template('event.html', events=events, pagination=pagination, show_followed=show_followed, event=event)

post_event.html

    {% extends "base.html" %}
{% block content %}
  <div class="breadcrumbs">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-lg-6 col-md-6 col-12">
                    <div class="breadcrumbs-content">
                        <h1 class="page-title">Events</h1>
                    </div>
                </div>
                <div class="col-lg-6 col-md-6 col-12">
                    <ul class="breadcrumb-nav">
                        <li><a href="/">Home</a></li>
                        <li>Events</li>
                    </ul>
                </div>
            </div>
        </div>
  </div>

<form method="post" enctype="multipart/form-data" action="">
   {{ form.hidden_tag() }}
  <div class="search-form wow fadeInUp" data-wow-delay=".7s" style="background: none; margin-top:50px; margin-bottom:50px">

    <div class="form-group">
      <label for="Title" style="color: black" >Event Title</label>
      {{ formupload.label }} {{ formupload.title(class='form-control' )}}
    </div>

    <div class="form-group col-md-6">
      <label for="organizer" style="color: black" >Organizer</label>
     <!-- <input type="text" class="form-control" id="Organizer"> -->

      <div> {{ formupload.label }}  </div>
      <div> {{ formupload.organizer._value()}}</div>

    </div>
    <div class="form-group col-md-4">
      <label for="inputState" style="color: black" >Type</label>
          {{ formupload.csrf_token }}
          {{ formupload.type }}
          <ul>
            {% for error in formupload.type.errors %}
            <li style="color:red;">{{ error }}</li>
            {% endfor %}
          </ul>
    </div>
    <div class="form-group col-md-6">
      <label for="description" style="color: black" >Description</label>
      {{ formupload.label }} {{ formupload.description(class='form-control' )}}
      <!--<input type="text" class="form-control" id="desc"> -->
    </div>
    <div class="form-group col-md-6">
      <label for="starting_price" style="color: black" >Starting Price</label>
      {{ formupload.label }} {{ formupload.price(class='form-control' )}}
      <!-- <input type="text" class="form-control" id="Price"> -->
    </div>
      <div class="form-group">
        <label for="inputAddress2" style="color: black" >Address</label>
       <!-- <input type="text" class="form-control" id="Address" placeholder="Corso Duca degli Abruzzi, 24"> -->
        {{ formupload.label }} {{ formupload.address(class='form-control' )}}
     </div>
    <div class="form-group">
       <div class="form-check">
         <input class="form-check-input" type="checkbox" id="gridCheck">
         <label class="form-check-label" for="gridCheck" style="color: black">
          I agree to the Terms of Service and Privacy Policy
          </label>
        </div>
    </div>
    <div class="form-group">
        {{ formupload.file.label }}
        {{ formupload.file }}
        {{ formupload.upload }}
        {% for file in filelist %}
            <img class="upload-img"  src='{{ url_for("static",filename=file) }}' alt="">
        {% endfor %}
    </div>

    <div class="form-group">
        {{ form.submit(class="btn btn--primary") }}
    </div>

  </div>
</form>

  {% include "bottom.html" %}

<script src="{{ url_for('static',filename='js/bootstrap.min.js') }}"></script>
<script src="{{ url_for('static',filename='js/wow.min.js') }}"></script>
<script src="{{ url_for('static',filename='js/tiny-slider.js') }}"></script>
<script src="{{ url_for('static',filename='js/glightbox.min.js') }}"></script>
<script src="{{ url_for('static',filename='js/main.js') }}"></script>

{% endblock %}

【问题讨论】:

  • 是否调用了任何函数?您是否设置了调试输出或调试器断点?另外,你检查过日志吗?
  • 我从验证中调试了它,一切似乎都工作正常,它填充了表单,但对于事件模型它说:无法获得
  • 搜索那个错误信息,说不定你会发现什么。即使没有,也请在问题中添加完整的错误消息以及获得它的位置,以便下一个遇到相同问题的人有机会。

标签: python validation flask flask-sqlalchemy flask-wtforms


【解决方案1】:

除非您通过 Javascript 提交表单,否则表单提交将被发送到表单的 action 属性中的值。你的是空白的,这就是页面被重新加载的原因。

&lt;form method="post" enctype="multipart/form-data" action=""&gt;

更新:

您需要在 action 属性中指定路由,例如/event/new/event 取决于预期由哪一个处理表单。如果以上都不是,那么你必须定义一个路由服务器端(你的flask代码)并在action属性中指定路由。

【讨论】:

  • 那我该怎么办?
  • 好的,谢谢,但我的数据库中仍然没有任何价值。你有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 1970-01-01
  • 2016-12-23
  • 1970-01-01
相关资源
最近更新 更多