首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义pyramid_formalchemy表单

自定义pyramid_formalchemy表单
EN

Stack Overflow用户
提问于 2011-10-29 10:50:38
回答 1查看 766关注 0票数 2

我在pyramid_formalchemy中创建自定义表单时遇到问题。我怀疑包中有一个bug,并想确认我没有遗漏任何东西。我的设置如下所示:

代码语言:javascript
复制
def includeme(config):
    config.include('pyramid_formalchemy')
    # Adding the jquery libraries
    config.include('fa.jquery')
    # Adding the package specific routes
    config.include('myapp.web.formalchemy.faroutes')

    config.formalchemy_admin('admin',
                             models=[User],
                             forms=faforms,
                             session_factory=session,
                             view='fa.jquery.pyramid.ModelView',
                             factory='myapp.model.RootFactory')

    config.formalchemy_model('user',
                             model='myapp.model.user.User',
                             session_factory=session,
                             view='fa.jquery.pyramid.ModelView',
                             factory='myapp.model.RootFactory')

faforms是一个包含我的自定义表单的模块:

代码语言:javascript
复制
from myapp.model.user import User

from formalchemy import FieldSet
from formalchemy import Grid

class UserFieldSet(FieldSet):
    def __init__(self):
        FieldSet.__init__(self, User)
        self.configure()

class UserGrid(Grid):
    def __init__(self):
        Grid.__init__(self, User)
        self.configure()

如果我注释掉上面的两个类,formalchemy就可以正常工作。我可以查看用户,也可以编辑他们。

当我放入这两个类时,我遇到了问题。问题是pyramid_formalchemy从模块的名称空间中获取UserGrid和UserFieldSet,然后尝试将它们当作实例化的类来使用。这会破坏一些东西。另一方面,如果pyramid_formalchemy没有找到,中的类将动态创建类并实例化它们。我认为有问题的代码在金字塔_formalchemy/views.py中,第236行,从get_grid()函数开始:

代码语言:javascript
复制
def get_grid(self):
    """return a Grid object"""
    request = self.request
    model_name = request.model_name
    form_name = '%sGrid' % model_name
    if hasattr(request.forms, form_name):
        g = getattr(request.forms, form_name)  <-- g is a class type not an
        g.engine = g.engine or self.engine     <-- instance!
        g.readonly = True                      <-- why is it not instantiated?
        g._request = self.request
        self.update_grid(g)
        return g
    model = self.context.get_model()           <-- UserGrid not found in faforms 
    grid = self.grid_class(model)              <-- module.
    grid.engine = self.engine                  <-- so a Grid is instantiated
    if not isinstance(request.forms, list):
        # add default grid to form module eg: caching
        setattr(request.forms, form_name, grid)
    grid = grid.copy()
    grid._request = self.request
    self.update_grid(grid)
    return grid

在这里您可以看到,如果没有找到匹配的网格(或字段集),它将被实例化,但如果找到,将直接使用类类型,而不是实际实例化。

有什么想法吗?我是不是设置错了什么?

基本上,我使用的是CSRF令牌,所以我需要定制我的表单,以便从会话中获取令牌。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-03 11:08:12

pyramid_formalchemy对如何设置表单文件做出了某些假设,这些假设大多是没有文档记录的。以下是我遇到并解决的问题……

  1. 例如,如果您有一个模型用户,那么您将需要一个名为UserFieldSet的FieldSet。
  2. UserFieldSet必须是实例而不是类。
  3. 在导入时要小心,否则会破坏pyramid_formalchemy所做的假设。如果您有一个模型类User,请导入User的包,而不是User类本身。然后通过在引用前加上包名来引用该类。

下面是一个使用上述3点的工作示例。

代码语言:javascript
复制
from myapp.model import user

from formalchemy import Field
from formalchemy import FieldSet
from formalchemy import Grid

UserFieldSet = FieldSet(user.User)
UserFieldSet.configure()

UserGrid = Grid(user.User)
UserGrid.configure()

你也可以在formalchemy group上发布更多信息。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7936685

复制
相关文章

相似问题

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