0

エンティティが作成されるモデルの名前をキャプチャするURLルートがあります。(例'/New<model>/')これで、モデル名が文字列になりました。その文字列を取得し、それを使用してこのモデルの新しいエンティティを作成し、データストアに配置するにはどうすればよいですか?

新しいモデルを登録し、登録されたモデルに基づいてフォームを動的に構築する機能を備えたGAEのカスタム管理インターフェイスを構築しています。次に、管理者ユーザーによって送信された投稿データを取得し、フォームが投稿されるURLに含まれる正しいモデルを使用してデータストアに配置できるようにする方法が必要です。私は現在、そのURLスキームに入ってくるリクエストを処理するハンドラーを構築していますが、この障害にぶつかっています。どんな助けでも大歓迎です。

4

2 に答える 2

0

でモデルクラスにアクセスできますが

globals()[modelname]

@TimHoffmanがコメントで指摘しているように、モデルクラスがモジュールレベルで定義されている場合、(悪意のある可能性のある)ユーザーにグローバルへの任意のアクセスを許可することは一般的にお勧めできません。

モデルクラスを動的に生成しているので、より安全な方法は、それらのモデルクラスをdictに保存することです。

model = { 'MyModel': MyModelClass, ... }

次に、文字列名を指定すると、次のコマンドmodelnameでクラスにアクセスできます。

model[modelname]
于 2013-03-08T14:05:20.240 に答える
0

クラスコンストラクターを取得するためにグローバルを使用しませんでした。代わりに、現在のモジュールを指す変数を作成し、getattrを使用してクラスコンストラクターをキャプチャしました。他の誰かが私がしたことを見たいと思った場合に備えて、これが私のハンドラーです。

class NewThingHandler(BaseRequestHandler):
    def get(self, thing):
        self.redirect('/admin/')
    def post(self, thing):
        this_module = sys.modules[__name__]
        ThisModel = getattr(this_module, thing)
        arguments = {}
        for property in ThisModel.properties().keys():
            if type(ThisModel._properties[property]) is db.DateProperty:
                this_date = map(int, self.request.get(property).split('/'))
                this_date = datetime.date(this_date[2], this_date[0], this_date[1])
                arguments[property] = this_date
                continue
            arguments[property] = self.request.get(property)

        new_thing = ThisModel(**arguments)
        new_thing.put()
        self.redirect('/admin/')

thingURLからキャプチャされます。

于 2013-03-15T21:32:08.253 に答える