2013-05-06 14 views
6

mã trong câu hỏi:hình thức rendering với bình + wtform

from flask import Blueprint, render_template, abort 
from flask.ext.wtf import Form 
import os 
from jinja2 import TemplateNotFound 
from models import Member 
from wtforms.ext.sqlalchemy.orm import model_form 
@simple_page.route('/register') 
def register(): 
    form = model_form(Member, Form) 
    return render_template('register.html', form=form, name="bad") 


class Member(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(50), nullable=False) 
    email = db.Column(db.String(50), nullable=False, unique=True) 

và theo quan điểm của tôi:

 <p class="txt11 colorb"> 
     {{ form.name }} 
     </p> 

này kết quả đầu ra <UnboundField(TextField,(), {u'default': None, u'filters': [], u'validators': [<wtforms.validators.Required object at 0x7f62f59b5590>, <wtforms.validators.Length object at 0x7f62f59b55d0>]})>, không phải là một lĩnh vực thực tế. làm thế nào để tôi có được một hình thức thực tế/lĩnh vực với wtform?

+0

Bạn có thể cập nhật câu hỏi của mình bằng các mục nhập mà bạn đang sử dụng không? –

+0

Tôi đã thêm mục nhập – tipu

+1

Từ nơi bạn nhập 'model_form'? –

Trả lời

2

Bạn cần phải làm một chút công việc:

{{ form.name.label }} : {{ form.name()|safe }} 

Hoặc, bạn có thể sử dụng handy snippet:

{% macro render_field(field) %} 
    <dt>{{ field.label }} 
    <dd>{{ field(**kwargs)|safe }} 
    {% if field.errors %} 
    <ul class=errors> 
    {% for error in field.errors %} 
     <li>{{ error }}</li> 
    {% endfor %} 
    </ul> 
    {% endif %} 
    </dd> 
{% endmacro %} 

Tất nhiên, điều chỉnh HTML rendered. Lưu tệp đó ở đâu đó trong thư mục templates của bạn và sau đó trong mẫu chính của bạn. Ở đây nó formhelpers.html:

{% from "formhelpers.html" import render_field %} 
<form method=post action="/register"> 
    <dl> 
    {{ render_field(form.name) }} 
    {{ render_field(form.email) }} 
    </dl> 
    <p><input type=submit value=Register> 
</form> 
+0

tôi đã thử đề xuất của bạn, tôi nhận được: TypeError: đối tượng 'Unbound Field' không thể gọi được. – tipu

11

Bạn đang đi qua một lớp mẫu không phải là một ví dụ hình thức cho mẫu. Phương thức model_form tạo ra một lớp mới động, có thể được sử dụng lại, mở rộng và sử dụng giống như bất kỳ lớp con biểu mẫu nào khác. Bạn cũng không cần thiết phải tạo lớp biểu mẫu này trên mọi lượt xem của mình, vì vậy bạn có thể di chuyển cuộc gọi này ra ngoài chế độ xem của mình.

Bạn đi qua một lớp uninstantiated cũng là lý do tại sao bạn nhận được hành vi kỳ lạ liên quan đến UnboundField (đó là cách WTForms xử lý instantiation lĩnh vực declarative)

Việc sửa chữa rất đơn giản:

MemberForm = model_form(Member, base_class=Form) 

@simple_page.route('/register') 
def register(): 
    form = MemberForm(name=u'bad') 
    return render_template('register.html', form=form) 
+0

Ví dụ trên làm việc cho tôi. Cám ơn rất nhiều. – jwogrady

1

Tôi biết điều này là khá cũ, nhưng tôi đã có cùng một vấn đề và tôi muốn chia sẻ giải pháp của tôi cho nhu cầu tương lai.

Tôi cũng có html được hiển thị bởi "UnboundField". Sau khi chiến đấu với mã tôi phát hiện ra tôi đang sử dụng:

from wtforms import Form 

Và nó có vẻ tốt, nhưng khi sử dụng Flask tôi phải làm điều này:

from flask.ext.wtf import Form 

Cố định vấn đề của tôi. Hy vọng nó đã giúp

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