Рендеринг разных шаблонов Django в одном представлении на основе классов

#html #django #django-class-based-views

#HTML #django #django-class-based-views

Вопрос:

Я начинаю использовать представления на основе классов для приложения, которое я создаю, но я не уверен, как это работает.

Мне нужно иметь три разных шаблона, и каждый шаблон будет отображать разную информацию в зависимости от поля модели. Мой вопрос в том, есть ли способ иметь только одно представление класса, которое может отображать три разных шаблона html с 3 разными контекстами, или мне нужно создать 3 разных класса.

Используя представления на основе функций, я бы просто сделал это:

 # def humanResourcesView(request):
#     context = {
#         'data' : Document.objects.all().filter(documentType='humanResources'),
#     }
#     return render(request, 'main/hr.html', context)


# #view to display training documents after click
# def trainingView(request):
#     context = {
#         'data' : Document.objects.all().filter(documentType='training'),
#     }
#     return render(request, 'main/training.html', context)


# #view to display resource documents after click
# def reportsView(request):
#     context = {
#         'data' : Document.objects.all().filter(documentType='reports')
#     }
#     return render(request, 'main/reports.html', context)


 

Но я не уверен, как это работает с представлениями на основе классов. В настоящее время у меня есть это, которое правильно отображает и фильтрует данные для одного шаблона, но я не знаю, как сделать несколько шаблонов. Нужно ли мне создавать 3 разных класса?

 class DocumentView(View):
    def get(self, request, *args, **kwargs):
        reports = Document.objects.all().filter(documentType="reports")

        context = {
            'reports' : Document.objects.all().filter(documentType='reports')
        }
        return render(request, 'documents/reportsDocs.html', context)
 

Есть ли способ иметь только один класс и передавать определенный контекст в зависимости от

Комментарии:

1. Вы можете использовать TemplateView из общих представлений Django и переопределить его get_template_name метод. Но в вашем случае вы жестко запрограммировали documentType so, я не думаю, что вы можете переключаться на разные шаблоны. Для этого вам нужно передать свой documentType сквозной URL и т. Д.

Ответ №1:

Вам нужно будет наследовать TemplateView и переопределять get_template_names метод, чтобы вернуть ваш условный шаблон. И вы бы переопределили get_context_date выборку данных соответствующим образом.

 from django.views.generic import TemplateView


class DocumentView(TemplateView):
    def get_template_names(self):
        pass

    def get_context_data(self, **kwargs):
        pass