2013-11-24 6 views
2

간단한 라디오 필드가 있으며 항상 validate_on_submit이 false를 반환합니다. form.errors를 출력 할 때, "유효하지 않은 선택"이 coerce = int에도 불구하고 라디오 필드의 값으로 전달되고있는 것처럼 보입니다.validate_on_submit은 Flask WTForms를 사용하여 항상 false를 반환합니다.

양식에서 반환 된 내용이 무엇이든지 나올 것으로 생각하지 않습니다. 올바른 방법으로 동적 선택을하는 것이 좋겠습니다. 나는 이것이 왜 실패하는지 이해하지 못합니다.

내 프로젝트의 관련 부분은 다음과 같습니다.

forms.py :

class SelectRecord(Form): 
    rid = RadioField("Record Select", choices=[], coerce=int,validators=[InputRequired()]) 

views.py :

@mod.route('/select/', methods=('GET', 'POST')) 
@login_required 
def select_view(): 
    form = SelectRecord(request.form) 
    if form.validate_on_submit(): 
     rid = form.data.rid 
     if form['btn'] == "checkout": 
      # check out the requested record 
      Records.checkoutRecord(rid) 
      return render_template('/records/edit.html',rid=rid) 
     elif form['btn'] == "checkin": 
      Records.checkinRecord(rid) 
      flash("Record checked in.") 
    else: 
     mychoices = [] 
     recs_co = session.query(Records.id).filter(Records.editing_uid == current_user.id). \ 
      filter(Records.locked == True) 
     for x in recs_co: 
      mychoices.append((x.rid,"%s: %s (%s)" % (x.a, x.b, x.c, x.d))) 
     x = getNextRecord() 
     mychoices.append((x.id,"%s: %s (%s %s)" % (x.a, x.b, x.c, x.d))) 
     form.rid.choices = mychoices 
    print form.errors 
    return render_template('records/select.html', form=form) 

그리고 내 템플릿 (select.html) :

<form method="POST" action="/select/" class="form form-horizontal" name="select_view"> 
     <h1>Select a record to edit:</h1> 
     {{ render_field(form.rid, class="form-control") }} 
     {{ form.hidden_tag() }} 
     <button type="submit" name="btn" class="btn" value="Check Out">Check Out</button> 
     <button type="submit" name="btn" class="btn" value="Check In">Check In</button> 
    </form> 

답변

5

이 보이는 자신의 분야를 ...

rid = RadioField("Record Select", choices=[], coerce=int,validators=[InputRequired()]) 

선택 항목을 빈 목록으로 남겨 둡니다. 당신은 기본적으로 "이 분야에서 유효한 선택이 없습니다"라고 말하고 있습니다. WTForms가 선택할 수있는 선택 사항이 없다고 생각하면 사용하는 선택 항목이 항상 유효하지 않습니다. 당신이 당신의 else 문 아래 그 선택을 추가하려고처럼

자,이 실행되는 시간에 ...

form.rid.choices = mychoices 

보이는 올바르게 양식을 렌더링 할 수 있습니다 (귀하의 방법이 끝날 때 발생합니다). 그러나, 타이밍의 형태가 너무 늦어 양식의 객체에 유효성 검사의 일부로 사용될 수 없기 때문에, 그 방법의 상단 부근에서 발생합니다. validate_on_submit()!

validate_on_submit을 실행하기 전에 form.rid.choices를 채우기 위해 사용하는 코드를 가져 와서 실행하십시오.

+0

나는 또한 매우 유사하게 보이고 도울지도 모른 [이 질문] (http://stackoverflow.com/questions/13964152/not-a-valid-choice-for-dynamic-select-field-wtforms)를주의했다. –