Изменение общей модели представления классов в Django - PullRequest
0 голосов
/ 24 мая 2018

В общем UpdateView, если вам нужно динамически изменить форму в зависимости от переданного объекта, вы можете использовать эту функцию (как в this answer):

def get_form_class(self):
    if self.object.pk == 1:
        return MyForm
    else:
        return OtherForm

IsЕсть ли аналогичная функция, если я хочу изменить 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 голосов
/ 24 мая 2018

Нет метода 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'])
0 голосов
/ 24 мая 2018

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

...