Django泛型类视图模型更改

时间:2018-05-24 12:11:39

标签: python django django-models django-forms

在通用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')

2 个答案:

答案 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'])