代码之家  ›  专栏  ›  技术社区  ›  Mike Vlad

Django泛型类视图模型更改

  •  0
  • Mike Vlad  · 技术社区  · 7 年前

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

    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 回复  |  直到 7 年前
        1
  •  3
  •   Antwane    7 年前

    如以下文件所述: 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(我不是这个网站的创造者,也与之无关,但我几乎每天都在使用它……)。

        2
  •  1
  •   Alasdair    7 年前

    没有一个 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'])