2014-12-03 4 views
0

После отправки формы, кажется, что значения поля возвращаются в нуль. Я выполняю некоторую проверку формы; если форма недействительна, у меня появляется сообщение об ошибке из списка ошибок, но я хочу, чтобы значения полей оставались. Есть ли способ сделать это?Как сохранить значения полей в форме после отправки?

Это мое мнение, что подтверждает вид:

@app.route('/booking', methods=['GET', 'POST']) 
def booking(): 
    errors = [] 
    if request.method == 'GET':  
     return render_template('booking.html', errors=errors) 
    else: 
     # grab values from form fields and store them in objects 
     start_date = request.form['start_date'] 
     end_date = request.form['end_date'] 
     name = request.form['name'].strip() 
     email = request.form['email'].strip()  

     # check if all fields are non-empty and raise an error if not 
     if not start_date or not end_date or not name or not email: 
      errors.append('Please enter all the fields.') 
     else: 
      # converts dates to Unix time-stamp for easier validation/calculations 
      start_timestamp = dt.strptime(start_date, "%d/%m/%Y") 
      end_timestamp = dt.strptime(end_date, "%d/%m/%Y") 

      # checks to see if dates are valid   
      if start_timestamp > end_timestamp or end_timestamp < start_timestamp:    
       errors.append('Please enter a valid date range') 
      else: 
       #checks to see if booking has already been taken 
       bookings = read_file('app/static/bookings.csv')  
       for i in bookings: 
        s_date = dt.strptime(i[0], "%d/%m/%Y") 
        e_date = dt.strptime(i[1], "%d/%m/%Y") 
        if s_date <= start_timestamp <= e_date: 
         errors.append('Booking has already been taken, please select another date') 
         break 

      # checks to see if email address is valid using regex 
      if not valid_email_address(email): 
       errors.append('Please enter a valid email address')   

      #if no errors have occured then write booking to file 
      if not errors: 
       new_booking = [start_date, end_date, name, email] 
       bookings.append(new_booking) 
       write_file(bookings, 'app/static/bookings.csv') 
       return render_template('booking.html') 
    return render_template('booking.html', errors=errors) 

Это шаблон для формы:

<div id="main-wrapper"> 
    <div id="main">  
     <div id="info"> 
      {% if errors %} 
      {% for error in errors %} 
      <div><p>{{ error }}</p></div> 
      {% endfor %} 
      {% endif %} 
      <form action = "booking" method="post"> 
      <input id="start_date" type="text" name="start_date"> 
      <input id="end_date" type="text" name="end_date"> 
      <input type="text" name="name" /> 
      <input type="text" name="email" /> 

      <input type="submit" value="Submit"> 
     </div> 
    </div> 
</div> 

ответ

3

Вы бы лучше использовать библиотеку форм, таких как WTForms (и связанное с ним расширение Flask-WTF) вместо этого все вручную.

Но если вы настроены на этот метод, то это довольно трогательно. Вы должны указать значение from request.form для входов HTML.

<input id="start_data" type="text" name="start_date" value="{{ request.form['start_date'] }}"/> 
Смежные вопросы