0

モデル名を引数として取り、そのモデル名を処理してさらにパラメーターを取得するクラスベースの汎用ビューに取り組んでいます。モデル名を URLconf のエントリにハードコーディングすると、問題なく動作しました。

url(r'^generic/', ResultCreateView.as_view(model = 'SomeTask'))

クラスベースのビューのスニペット:

class ResultCreateView(CreateView):
    model = None #this is here, expecting to be overwritten, because otherwise I get an error saying I can't pass in the 'model' kwarg above because 'model' is not already an attribute of the class
    def __init__(self,*args, **kwargs):
        self.model = get_model_object_from_modelname(kwargs['model'])
        self.form_class = my_custom_function_to_generate_a_formclass(self.model)
        self.template_name = self.model.template #template_name is an attribute I set on the model class
        return super(ResultCreateView,self).__init__(*args, **kwargs)

URL経由でモデルパラメータを渡すように切り替えようとしたとき、つまり:

url(r'^tasks/(?P<model>\w+)$', ResultCreateView.as_view())

カスタムのinitメソッドが機能しなくなりました。私は得る:

ResultCreateView にクエリセットがありません。ResultCreateView.model、ResultCreateView.queryset を定義するか、ResultCreateView.get_queryset() をオーバーライドします。

「モデル」引数がURLパターンからビュークラスに渡される場所/時期がわかりません。理想的には、どちらの場合でもこのビューを機能させたい (URLconf のハードコードされたパラメーターまたは URL パターンからのパラメーター) が、適切なタイミングで処理が行われるように処理を行うコードをどこに配置すればよいかわかりません。 . そのコードを配置する適切な場所はどこですか、または使用すべき別のアプローチはありますか?

EDIT:(さらに複雑:「モデル」を引数として取るデコレータでビューを装飾する必要があります。)

4

1 に答える 1