我正在研究一个基于类的通用视图,该视图将模型名称作为参数并处理该模型名称以获取更多参数。当我将模型名称硬编码到 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())
我的自定义初始化方法不再有效。我得到:
ResultCreateView 缺少查询集。定义 ResultCreateView.model、ResultCreateView.queryset,或覆盖 ResultCreateView.get_queryset()
我无法弄清楚“模型”参数在何处/何时从 URL 模式传递到视图类。理想情况下,我希望能够使该视图在任何一种情况下都能正常工作(URLconf 中的硬编码参数或 URL 模式中的参数),但我不知道将执行处理的代码放在哪里,以便它在正确的时间发生. 放置该代码的正确位置在哪里,还是我应该使用另一种方法?
编辑:(额外的复杂性:我需要使用以“模型”作为参数的装饰器来装饰视图。)