簡體   English   中英

使用 Flask 和 WTForms 的單個頁面中的多個表單,其中一個表單鏈接到另一個

[英]Multiple forms in a single page using flask and WTForms in which one form link to another

這是現在的樣子:

形式一

形式二

這就是我需要的

  • 我需要兩種形式,一種鏈接到同一頁面中的另一種。
  • 在第一個表單上:將有一個輸入框供用戶填寫。
  • 如果輸入有效,系統應引導用戶進入第二個表單。
  • 該表單將打印出系統找到的結果,並要求用戶在輸入框中輸入一個數字。
  • 系統將查看輸入是否有效。 如果是,它會做一系列的動作()

(粗體字是有效的部分)

我的代碼:

主功能

@app.route("/searchArea", methods=['GET', 'POST'])
@login_required
def searchArea():
  if current_user.is_authenticated and verifyIdentity(current_user.username)==True:
    form1 = FindArea()
    form2 = SelectUser()
    if form1.submit1.data and form1.validate(): 
      allMatch = User.query.filter_by(area=form1.area1.data).all()
      
      if(allMatch == []):
        flash('area code does not exist', 'danger')
        return redirect(url_for('searchArea'))
      if form2.submit2.data and form2.validate(): #######
        user_select = int(form2.area.data)
        if(user_select>0 or user_select<=len(allMatch)):
          user= allMatch[user_select-1]
          author_name = user.username
          posts = Post.query.filter_by(author=author_name).all()
          emty_list = []
          while(len(posts)!= emty_list):
            db.session.delete(posts[0])
          db.session.delete(user)
          db.session.commit()
          return redirect(url_for('home'))
          flash('change have been made successfully', 'success')
          #return redirect(url_for('deleteUser',user=allMatch[user_select]))
        else:
          return redirect(url_for('searchArea'))
          flash('check your entry', 'danger')#######
      return render_template('print_area.html', title='Account',users=allMatch,form=form2)
    return render_template('searchArea.html', title='Account',form=form1)

表格.py

class FindArea(FlaskForm):
  area1=TextAreaField('Area Code', validators=[DataRequired()])
  submit1 = SubmitField('Search')
class SelectUser(FlaskForm):
  area2=TextAreaField('user number', validators=[DataRequired()])
  submit2 = SubmitField('confirm')

模板(searchArea.html)

{% extends "layout.html"%} {% block content %}
<div>
    <form method="POST" action="" enctype="multipart/form-data">
        {{ form.hidden_tag() }}


        <div class="form-group">
            {{ form.area1.label(class="form-control-label") }} {% if form.area1.errors %} {{ form.area1(class="form-control form-control-lg
            is-invalid") }}
            <div class="invalid-feedback">
                {% for error in form.area1.errors %}
                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.area1(class="form-control form-control-lg") }}
                    {% endif %}
                </div>
          
        
          {{ form.submit1(class="btn btn-outline-info") }}
      </form>
  </div>
{% endblock content %}

模板(print_area.html)

{% extends "layout.html"%} {% block content %}
<div>
    <form method="POST" action="" enctype="multipart/form-data">
        {{ form.hidden_tag() }}


        <div class="form-group">
            {{ form.area.label(class="form-control-label") }} {% if form.area.errors %} {{ form.area(class="form-control form-control-lg
            is-invalid") }}
            <div class="invalid-feedback">
                {% for error in form.area.errors %}
                <span>{{ error }}</span>
                            {% endfor %}
                        </div>
                    {% else %}
                        {{ form.area(class="form-control form-control-lg") }}
                    {% endif %}
                </div>
          
        
          {{ form.submit(class="btn btn-outline-info") }}
      </form>
  </div>
{% endblock content %}

任何幫助都會很棒! 謝謝!

當你點擊form2的提交按鈕時,這個條件( if form1.submit1.data and form1.validate():為False。可能你需要更改代碼邏輯。

好的,這就是我從這一課中學到的東西。 form.validate()return render在編碼時是一件非常棘手的事情,它從頂部到底部運行兩次,第一次當你進入頁面時它不會驗證但呈現,第二次它驗證; 除了添加一個變量來檢查第一個表單是否已提交,並在第一個表單尚未提交時返回第一個渲染,否則返回渲染第二個。 這是我對代碼的修復:

主功能

@app.route("/searchArea", methods=['GET', 'POST'])
@login_required
def searchArea():
  global allMatch
  form1Passer = False
  
  if current_user.is_authenticated and verifyIdentity(current_user.username)==True:
    
    form1 = FindArea()
    form2 = SelectUser()
    
    if form1.submit1.data and form1.validate() and form1Passer == False: # notice the order 
      
      form1Passer == True
      
      allMatch = User.query.filter_by(area=form1.area1.data).all()
      
      if(allMatch == []):
        flash('area code does not exist', 'danger')
        return redirect(url_for('searchArea'))
      return render_template('print_area.html', title='Account',users=allMatch,form=form2)
    
    if form2.submit2.data and form2.validate(): # notice the order
      
      user_select = int(form2.area2.data)
      if(user_select>0 and user_select<=len(allMatch)):
        print("0")
        user= allMatch[user_select-1]
        print("1")
        
        print("2")
        posts = Post.query.filter_by(author=user).all()
        print(type(posts))
        while(True):
          try:
            db.session.delete(posts[0])
          except:
            break
        db.session.delete(user)
        db.session.commit()
        return redirect(url_for('home'))
        flash('change have been made successfully', 'success')
        #return redirect(url_for('deleteUser',user=allMatch[user_select]))
      else:
        
        return redirect(url_for('searchArea'))
        flash('check your entry', 'danger')
    
    if form1Passer == False:
      
      return render_template('searchArea.html', title='Account',form=form1)
    else:
      
      return render_template('print_area.html', title='Account',users=allMatch,form=form2)

無需修改。 如果你和我有同樣的問題希望這對你有幫助!

編輯:上面的代碼完全有效(但這是一個糟糕的做法)但是當查詢返回一個列表時,其中的對象沒有鏈接到對象本身!

有點像超市的地址! 當您更改地址時,您下拉的地址不會影響超市的實際位置。

而且當超市移動時,地址不會自動更新!

使用過濾器方法和 .first() 可以避免任何可能出現的未來問題! 由於 .first() 是對象本身的直接控制器

當您只為對象分配一個值時(例如:post_target.prperty = value),下面的代碼也適用,而上面的則不行(# 是我修改的行):

allMatch=[] #
user; #

@app.route("/searchArea", methods=['GET', 'POST'])
@login_required
def searchArea():
  global allMatch
  global user
  form1Passer = False
  form2Passer = False
  
  if current_user.is_authenticated and verifyIdentity(current_user.username)==True:
    
    form1 = FindArea()
    form2 = SelectUser()
    form3 = ConfirmForm()
    
    if form1.submit1.data and form1.validate() and form1Passer == False: # notice the order 
      
      form1Passer == True
      if(form1.area1.data == "0"):
        flash('this is an illegal move', 'danger')
        return redirect(url_for('searchArea'))
      allMatch = User.query.filter_by(area=form1.area1.data).all()
      
      if(allMatch == []):
        flash('area code does not exist', 'danger')
        return redirect(url_for('searchArea'))
      
      return render_template('print_area.html', title='Account',users=allMatch,form=form2)
    
    if form2.submit2.data and form2.validate() and form2Passer == False: # notice the order
      
      user_select = int(form2.area2.data)
      if(user_select>0 and user_select<=len(allMatch)):
        
        user= allMatch[user_select-1]
        return render_template('confirm.html', title='Account',user=user,form=form3)
      else:
        flash('check your entry', 'danger')
        return redirect(url_for('searchArea'))
    
    if form3.submit_cancel.data and form3.validate():
        return redirect(url_for('searchArea'))
    if form3.submit_confirm.data and form3.validate():
        user_target = User.query.filter_by(email = user.email).first()#
        while(True):
          try:
            post_target = Post.query.filter_by(author=user_target).first()#
            db.session.delete(post_target)#
            db.session.commit()
          except:
            break
        db.session.delete(user_target)#
        db.session.commit()
        flash('change have been made successfully', 'success')
        return redirect(url_for('home'))
        
        #return redirect(url_for('deleteUser',user=allMatch[user_select]))
      
    
    if form1Passer == False:
      
      return render_template('searchArea.html', title='Account',form=form1)
    elif form2Passer == False:
      
      return render_template('print_area.html', title='Account',users=allMatch,form=form2)
    else:
      return render_template('confirm.html', title='Account',user=user,form=form3)
  elif current_user.is_authenticated:
    abort(403)
  else:
    return redirect(url_for('home'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM