пользовательские формы пирамида_формальхимия - PullRequest
2 голосов
/ 29 октября 2011

У меня проблемы с созданием пользовательских форм в 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, поэтому мне нужно настроить свои формы, чтобы получать токены из сессии.

Спасибо.

1 Ответ

5 голосов
/ 03 ноября 2011

pyramid_formalchemy делает определенные, в основном недокументированные предположения, о том, как вы настраиваете свой файл форм.Вот ошибки, с которыми я столкнулся и работал ...

  1. Если у вас есть, например, пользователь модели, вам понадобится FieldSet с именем UserFieldSet.

  2. UserFieldSet должен быть экземпляром, а не классом.

  3. Будьте внимательны при импорте, иначе вы нарушите предположения, сделанные pyramid_formalchemy.Если у вас есть класс модели User, импортируйте пакет User, но не сам класс User.Затем сделайте ссылку на класс, добавив префикс к имени пакета.

Ниже приведен рабочий пример с использованием трех пунктов выше.

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()

Вы также можете опубликовать сообщение в формальная группа для получения дополнительной информации.

...