Skip to main content
 首页 » 编程设计

python之Django DetailView 动态模型

2024年10月17日41soundcode

我正在尝试为 Django 应用程序的多个模型创建一个 View 。该应用基本上是一个具有一些自定义功能的管理后台。

在每个项目的更新 View 中,我认为最好只定义一个DetailView 并动态获取模型名称。

1) 这是正确的方法还是每个模型一个 DetailView 更好?

2)可能吗?如果可以,如何实现?

views.py

class EquipoUpdate(UpdateView): 
    model = DYNAMIC_MODEL 
    fields = ['codigo', 'equipo', 'nombre', 'fabricante', 'modelo', 'fecha_alta', 'fecha_baja', 'descripcion','datos_contacto'] 
    success_url = reverse_lazy('listados-mantenimiento', kwargs={'model_type': 'componentes'}) 
    template_name = 'manager/mto/mto_update.html' 

urls.py

    url(r'^mantenimiento/(?P<model_type>\w{0,50})/update/(?P<pk>\d+)$', views.EquipoUpdate.as_view()), 

DYNAMIC_MODEL 是我想从 urls.py model_type 获取的变量

我的第一个方法是使用 def get_context_data:

def get_context_data(self, **kwargs): 
    modelo = self.kwargs['model_type'] 
    context = super(MtoListView, self).get_context_data(**kwargs) 
    if (modelo == 'equipos'): 
        context['listado'] = Equipo.objects.all() 
    elif (modelo == 'componentes'): 
        context['listado'] = Componente.objects.all() 
    ... 

但我担心大型数据库会导致性能问题。

提前致谢。

请您参考如下方法:

您可以覆盖 get_queryset() 方法以在从 model_kwarg 获取模型后返回适当模型的查询集。

要从 model_type kwarg 获取模型,您可以创建一个 MODEL_TYPE_KWARGS_TO_MODEL_MAPPING 字典。它将通过使用 model_type kwarg 作为键对其执行查找来返回模型。当然,您必须为无效的 model_type 情况添加错误处理。

你可以这样做:

class DynamicModelUpdate(UpdateView): 
 
    def get_queryset(self): 
         model = MODEL_TYPE_KWARGS_TO_MODEL_MAPPING[self.kwargs['model_type']] 
         return model.objects.all()