首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLAlchemy / WTForms - QuerySelectField

SQLAlchemy / WTForms - QuerySelectField
EN

Stack Overflow用户
提问于 2015-03-15 18:17:20
回答 1查看 1.2K关注 0票数 0

我在一个金字塔应用程序上使用带有WTForms扩展的SQLAlchemy。

我的会议是:

代码语言:javascript
复制
from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

我的模型是:

代码语言:javascript
复制
class Client(Base):
    __tablename__ = 'client'
    id = Column(Integer, primary_key=True, nullable=False)
    name = Column(Unicode(48))
    street = Column(Unicode(48))
    city = Column(Unicode(32))
    task = relationship("Task", backref="client")

    @classmethod
    def active(cls):
         return DBSession.query(Client).options(load_only("id", "name")).order_by(sa.desc(Client.name)).filter(Client.status == True)


class Task(Base):
    __tablename__ = 'task'
    id = Column(Integer, primary_key=True, nullable=False)
    name = Column(String(48))
    status = Column(Boolean)
    client_id = Column(Integer, ForeignKey('client.id'))

我的表格是:

代码语言:javascript
复制
def enabled_client():
     return Client.active()

class TaskCreateForm(ModelForm):
    name = TextField('Task name', [validators.Length(min=1, max=48)], filters=[strip_filter])
    status = BooleanField('Status')
    client_id = QuerySelectField('Client', query_factory=enabled_client, get_label='name', allow_blank=False)

我的看法是:

代码语言:javascript
复制
@view_config(route_name='task_action', match_param='action=create', renderer='arx:templates/task_edit.mako', permission='edit')
def task_create(request):
    task = Task()
    form = TaskCreateForm(request.POST)
    if request.method == 'POST' and form.validate():
        form.populate_obj(task)
        DBSession.add(task)
        return HTTPFound(location=request.route_url('home'))
    return {'form':form, 'action':request.matchdict.get('action')}

表单显示带有适当客户端名称的复选框,但是当我试图提交表单时,问题就出现了。WTForm应该使用客户端的真实ID,但它传递SQLAlchemy对象,例如:

代码语言:javascript
复制
   <arx.models.Client object at 0x7fdfb139ddd0>

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-18 18:18:34

我的表单太具体了(应该是客户端而不是client_id),所以我的工作代码如下所示:

会话:

代码语言:javascript
复制
from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Base = declarative_base()

型号:

代码语言:javascript
复制
class Client(Base):
     __tablename__ = 'client'
     id = Column(Integer, primary_key=True, nullable=False)
     name = Column(Unicode(48))
     street = Column(Unicode(48))
     city = Column(Unicode(32))
     task = relationship("Task", backref="client")

    @classmethod
    def active(cls):
        return DBSession.query(Client).options(load_only("id", "name")).order_by(sa.desc(Client.name)).filter(Client.status == True)


class Task(Base):
    __tablename__ = 'task'
    id = Column(Integer, primary_key=True, nullable=False)
    name = Column(String(48))
    status = Column(Boolean)
    client_id = Column(Integer, ForeignKey('client.id'))

表格:

代码语言:javascript
复制
def enabled_client():
    return Client.active()

class TaskCreateForm(ModelForm):
    name = TextField('Task name', [validators.Length(min=1, max=48)], filters=[strip_filter])
    status = BooleanField('Status')
    client = QuerySelectField('Client', query_factory=enabled_client, get_label='name', allow_blank=False)

查看:

代码语言:javascript
复制
@view_config(route_name='task_action', match_param='action=create', renderer='arx:templates/task_edit.mako', permission='edit')
def task_create(request):
    task = Task()
    form = TaskCreateForm(request.POST)
    if request.method == 'POST' and form.validate():
        form.populate_obj(task)
        DBSession.add(task)
        return HTTPFound(location=request.route_url('home'))
    return {'form':form, 'action':request.matchdict.get('action')}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29064405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档