2016-06-04 5 views
2

Я пытаюсь создать один вид для нескольких моделей для приложения django. Приложение в основном является бэкэндом администратора с некоторыми настраиваемыми функциями.Динамическая модель Django DetailView

В представлении обновления каждого элемента, я думаю, лучше иметь только один 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() 
    ... 

но я боюсь, что большая база данных приведет к производительности.

Заранее спасибо.

ответ

1

Вы можете переопределить метод 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() 
Смежные вопросы