У меня проблемы с созданием пользовательских форм в pyramid_formalchemy.Я подозреваю, что в пакете есть ошибка, и хотел подтвердить, что я ничего не пропускаю.Моя установка выглядит следующим образом:
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()
Если я закомментирую два вышеупомянутых класса, формальхимия будет работать нормально.Я могу просматривать пользователей и редактировать их.
Когда я добавляю два класса, у меня возникают проблемы.Проблема заключается в том, что pyramid_formalchemy захватывает UserGrid и UserFieldSet из пространства имен модуля, а затем пытается использовать их, как если бы они были экземплярами классов.Это ломает вещи.С другой стороны, если pyramid_formalchemy не найдет классы, они будут динамически создавать классы и создавать их экземпляры.Я полагаю, что нарушающий код находится в pyramid_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
Здесь вы можете увидеть, если соответствующая сетка (или fieldset) не найдена, будетсоздан, но если он будет найден, тип класса будет использоваться напрямую, но не на самом деле.
Есть мысли здесь?Я что-то настраиваю неправильно?
В основном я использую токены CSRF, поэтому мне нужно настроить свои формы, чтобы получать токены из сессии.
Спасибо.