モデル名を引数として取り、そのモデル名を処理してさらにパラメーターを取得するクラスベースの汎用ビューに取り組んでいます。モデル名を 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:(さらに複雑:「モデル」を引数として取るデコレータでビューを装飾する必要があります。)