在通用UpdateView
中,如果您需要根据传递的对象动态更改表单,则可以使用此函数(如this answer中所述):
def get_form_class(self):
if self.object.pk == 1:
return MyForm
else:
return OtherForm
如果我想更改model
,是否有类似的功能?模型是:
class SomeUpdateView(generic.UpdateView):
login_required = True
template_name = '...'
model = SomeModel ## I need it to be dynamic
form_class = SomeForm
success_url = reverse_lazy('some_url')
答案 0 :(得分:3)
如ModelFormMixin.model的文档中所述,您可以通过覆盖get_queryset()来动态计算您的视图将要处理的查询集:
def get_queryset(self):
if any_condition:
return MyModel.objects.filter(type='foo')
elif another_condition:
return AnotherModel.objects.all()
else:
return MyModel.objects.all()
有一个很棒的网站可以快速检索基于Django类的视图的所有属性。我不认为我可以在这里做广告,但你可以从ccbv.co.uk访问它(我不是这个网站的创建者,也不是它的相关内容,但我几乎每天都使用它......)
答案 1 :(得分:1)
您无法覆盖get_model
方法。
相反,您可以覆盖get_queryset
,并返回要使用的模型的查询集。
def get_queryset(self):
if use_my_model():
return MyModel.objects.all()
else:
return OtherModel.objects.all()
或者您可以覆盖get_object
,并返回您要使用的模型的对象。
def get_object(self):
if use_my_model():
return get_object_or_404(MyModel, pk=self.kwargs['pk'])
else:
return get_object_or_404(OtherModel, pk=self.kwargs['pk'])