自定义金字塔形式

2024-06-02 06:30:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在金字塔形式学中创建自定义表单时遇到问题。我怀疑包里有个bug,想确认一下我没有遗漏任何东西。我的设置如下:

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是一个包含我的自定义表单的模块:

^{pr2}$

如果我把上面的两个类注释掉,形式论就可以了。我可以查看和编辑用户。在

当我把这两个班放进去时,我遇到了问题。问题是金字塔形式从模块的命名空间中获取UserGrid和UserFieldSet,然后试图将它们当作实例化的类来使用。这会破坏一切。另一方面,如果金字塔形式学找不到类,则会动态地创建类并实例化它们。我相信触犯法律的是金字塔理论/视图.py,第236行从get_grid()函数开始:

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令牌,所以我需要定制我的表单来从会话中获取令牌。在

谢谢。在


Tags: nameselfformconfigmodelrequestsessionfactory
1条回答
网友
1楼 · 发布于 2024-06-02 06:30:49

pyramid形式学确定了(大部分是未记录的假设),关于如何设置表单文件。这是我碰到的一些小问题。。。在

  1. 例如,如果您有一个模型用户,那么您将需要一个名为UserFieldSet的字段集。

  2. UserFieldSet必须是实例而不是类。

  3. 小心你的进口商品,否则你会打破金字塔理论的假设。如果您有一个模型类User,那么导入User的包,而不是User类本身。然后通过在引用前面加上包名来引用类。

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

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获取更多信息。在

相关问题 更多 >