2011-10-29 2 views
2

pyramid_formalchemy에서 사용자 지정 양식을 만드는 데 문제가 있습니다. 패키지에 버그가있는 것 같아서 무엇이든 놓치지 않았 음을 확인하고 싶었습니다. 내 설정은 다음과 같습니다 : 나는 위의 두 클래스를 주석 경우사용자 지정 pyramid_formalchemy 양식

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 잘 작동 :

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 내 사용자 지정 양식을 포함하는 모듈입니다. 사용자를 볼 수 있으며 편집 할 수 있습니다.

내가 두 클래스를 넣으면 문제가 발생합니다. 문제는 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 

당신이 일치하는 그리드 (또는 필드 셋이)가 ​​인스턴스화 될 것이다 발견되지 않는 경우 볼 수있는, 그러나 그것이 발견되면 클래스 유형은 직접적으로 사용되지만 실제로 인스턴스화되지는 않습니다.

여기에 의견이 있으십니까? 내가 잘못한 게있어?

기본적으로 나는 CSRF 토큰을 사용하고 있으므로 세션에서 토큰을 가져 오기 위해 양식을 사용자 정의해야합니다.

감사합니다.

+0

왜 이것이 스택 오버 플로우입니까? 그것은 https://github.com/FormAlchemy/pyramid_formalchemy/issues에 속한 버그 보고서와 같은 표현입니다. –

+1

나는 '질문'을 더 잘 표현해야한다고 생각합니다. 내가 github에 버그가 될 수있는 게시물을 게시하기 전에 올바르게 설정하고 있음을 확인하고 싶습니다. – lostdorje

답변

5

pyramid_formalchemy는 양식 파일을 설정하는 방법에 대해 대부분 문서화되지 않은 가정을합니다. 당신은 예를 들어 모델의 사용자가있는 경우 여기에 내가 공격과 회피 개는 ...

  1. 는, 당신은 필드 집합이 UserFieldSet라는 있어야합니다.

  2. UserFieldSet은 클래스가 아닌 인스턴스 여야합니다.

  3. 수입에주의하거나 pyramid_formalchemy가 만드는 가정을 깨뜨릴 수 있습니다. 모델 클래스 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에 게시 할 수도 있습니다.