2011-10-29 5 views
2

pyramid_formalchemyでカスタムフォームを作成する際に問題が発生しています。私はパッケージにバグがあり、私が何かを逃していないことを確認したいと思っています。私のセットアップは次のようになります。カスタム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() 

私は正常に動作formalchemy、上記の2つのクラスをコメントアウトした場合。ユーザーを表示でき、ユーザーを編集することができます。

2つのクラスを配置すると、問題が発生します。問題はpyramid_formalchemyがモジュールの名前空間からUserGridとUserFieldSetを取得し、インスタンス化されたクラスであるかのようにそれらを使用しようとします。これは物事を壊す。一方、pyramid_formalchemyがクラスを見つけられない場合は、クラスを動的に作成してインスタンス化します。私は、ライン236はget_grid()関数で始まる、問題のあるコードがpyramid_formalchemy/views.pyであると信じて:

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

なぜこれがstackoverflowですか?それは、https://github.com/FormAlchemy/pyramid_formalchemy/issuesに属するバグレポートのように表現されています。 –

+1

私は「質問」をよりよく表現するべきだったと思います。私はgithubにバグかもしれないものを投稿する前に、物事を正しく設定していることを確認したい。 – lostdorje

答えて

5

pyramid_formalchemyは、フォームファイルの設定方法について、ほとんどの文書化されていない仮定をしています。ここに私がヒットし、周りに働いていた落とし穴は、あなたが例えばモデルのユーザーを持っている場合は、あなたがUserFieldSetと呼ばれるフィールドセットを持っている必要があります...

  1. です。

  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に投稿することができます。

関連する問題