我在pyramid_formalchemy中创建自定义表单时遇到问题。我怀疑包中有一个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是一个包含我的自定义表单的模块:
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()函数开始:
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令牌,所以我需要定制我的表单,以便从会话中获取令牌。
谢谢。
发布于 2011-11-03 11:08:12
pyramid_formalchemy对如何设置表单文件做出了某些假设,这些假设大多是没有文档记录的。以下是我遇到并解决的问题……
下面是一个使用上述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上发布更多信息。
https://stackoverflow.com/questions/7936685
复制相似问题