Django泛型类视图模型

2024-04-20 04:57:23 发布

您现在位置:Python中文网/ 问答频道 /正文

在generic UpdateView中,如果需要根据传递的对象动态更改窗体,可以使用此函数(如thisanswer中所示):

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')

Tags: 对象函数selfformurlgetmodelreturn
2条回答

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公司(我不是这个网站的创建者,也不是它的亲戚,但我几乎每天都在使用它……)。你知道吗

没有可以重写的get_model方法。你知道吗

相反,您可以重写get_queryset,并返回要使用的模型的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'])

相关问题 更多 >