2013-04-10 31 views
13

Tôi khá mới với wtforms và bình và đã rối tung xung quanh với các vùng chọn và gặp lỗi. Các hình thức bản thân làm việc tốt mà không có sự selectfield nhưng với nó tôi nhận được lỗi sau:Tôi đang gặp vấn đề với wtforms selectfields khi tôi sử dụng POST với Flask

Lỗi:

....fields.py", line 386, in pre_validate 
    for v, _ in self.choices: TypeError: 'NoneType' object is not iterable 

tôi thấy selectfield do vậy sẽ được trả lại. Tôi nghi ngờ bằng cách nào đó id không được xác nhận đúng trên POST và không trả lại. Hoặc nó có cái gì để làm với tuple selectfield của tôi được trả lại? Ngoài ra trường ID tôi đang sử dụng được lấy từ khóa tự động ndb của GAE(). Id() khá dài và đáng ghét. Có thể độ dài id đang được sử dụng cho vùng chọn quá dài?

Googling đã không cung cấp nhiều về vấn đề chính xác vì vậy tôi nghĩ rằng tôi sẽ đăng bài ở đây. Mã có liên quan bên dưới. Nếu tôi là thiếu một cái gì đó xin vui lòng cho tôi biết

đang views.py:

@app.route('/new/post', methods = ['GET', 'POST']) 
@login_required 
def new_post(): 

    form = PostForm() 
    if form.validate_on_submit(): 
     post = Post(title = form.title.data, 
        content = form.content.data, 
        hometest = form.hometest.data, 
        author = users.get_current_user()) 
     post.put() 
     flash('Post saved on database.') 
     return redirect(url_for('list_posts')) 
    form.hometest.choices = [ (h.key.id(),h.homename)for h in Home.query()] 

    return render_template('new_post.html', form=form) 

myforms.py:

class PostForm(Form): 
    title = wtf.TextField('Title', validators=[validators.Required()]) 
    content = wtf.TextAreaField('Content', validators=[validators.Required()]) 
    hometest = wtf.SelectField(u'Home Name List', coerce=int,validators=[validators.optional()]) 

new_post.html:

{% extends "base.html" %} 

{% block content %} 
    <h1 id="">Write a post</h1> 
    <form action="{{ url_for('new_post') }}" method="post" accept-charset="utf-8"> 
     {{ form.csrf_token }} 
     <p> 
      <label for="title">{{ form.title.label }}</label><br /> 
      {{ form.title|safe }}<br /> 
      {% if form.title.errors %} 
      <ul class="errors"> 
       {% for error in form.title.errors %} 
       <li>{{ error }}</li> 
       {% endfor %} 
      </ul> 
      {% endif %} 
     </p> 
     <p> 
      <label for="title">{{form.hometest.label}}</label><br/> 
      {{form.hometest}} 
      {% if form.hometest.errors %} 
     <ul class="errors"> 
      {% for error in form.hometest.errors %} 
      <li>{{ error }}</li> 
      {% endfor %} 
     </ul> 
     {% endif %} 
     </p> 
     <p> 
      <label for="title">{{ form.content.label }}</label><br /> 
      {{ form.content|safe }}<br /> 

      {% if form.content.errors %} 
      <ul class="errors"> 
       {% for error in form.content.errors %} 
       <li>{{ error }}</li> 
       {% endfor %} 
      </ul> 
      {% endif %} 
     </p> 
     <p><input type="submit" value="Save post"/></p> 
    </form> 
{% endblock %} 

Trả lời

26

Bạn cần phải thiết lập lựa chọn của bạn trước bạn gọi validate_on_submit như form.validate sẽ cố gắng để xác nhận giá trị được cung cấp (nếu có) đối với danh sách các lựa chọn (đó là None trước khi bạn đặt choices):

form = PostForm() 
form.hometest.choices = [(h.key.id(), h.homename) for h in Home.query()] 

if form.validate_on_submit(): 
    # form is valid, continue 
+0

Làm cách nào để bạn bỏ qua lĩnh vực cụ thể nếu bạn không muốn xác nhận trên nó? Tôi nhận được một lỗi cho trường ngày với validators = [validators.optional()] – moaglee

+0

Giá trị yêu cầu một câu hỏi riêng biệt về điều đó với một ví dụ tối thiểu, tái sản xuất. Ai đó sẽ có thể giúp :-) –

4

Bạn nên cung cấp choices=[...] tham số, như

wtf.SelectField(u'Home Name List', 
       choices=[(1, 'Label 1'), 
         (2, 'Label 2')], 
       coerce=int, 
       validators=[validators.optional()]) 
+2

có vẻ bạn thực sự không thể sử dụng tham số lựa chọn trong selectField cho sự lựa chọn năng động, như minh họa trong tài liệu, wtforms.readthedocs.io/en/latest/..., bởi vì ngay cả khi đối số lựa chọn của bạn trong trường chọn là một truy vấn như trong 'wtf.SelectField (u'Home Name List ', các lựa chọn = [(h.key.id(), h.homename) cho h trong Home.query()] , coerce = int) 'truy vấn đó không chạy mỗi khi biểu mẫu được hiển thị .. vì vậy các trường hợp tự động thêm vào sẽ không xuất hiện trong trình đơn thả xuống .. từ những gì tôi đã thử nghiệm –

Các vấn đề liên quan