Как отобразить модель с другим шаблоном на основе атрибута модели - PullRequest
0 голосов
/ 10 апреля 2019

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

У меня есть модель с именем Item.У него есть заголовок, основной текст, ссылки и т. Д. Однако у него также есть атрибут «тип», который представляет собой «видео», «подкаст» или «статья».

В настоящее время я использую общийкласс DetailView для отображения страницы сведений для Item.Шаблон называется item_detail.html и передается в запрос из DetailView.

Все, что я хочу сделать, - это сделать так, чтобы представление отправило другой шаблон, основанный на атрибуте type.Поэтому, если item.type = 'article' отображает шаблон статьи, если item.type = 'video' отображает шаблон видео.

Возможно ли это, пока еще используется DetailView?

Это то, что я пробовал в представлении:

class ItemDetailView(generic.DetailView):
     model = Item
     if Item.type == 'video':
        template_name = 'curate/item_video.html'

Это не сделало то, что я хотел - на самом делеШаблон просто отображается как обычно.Я что-то пропустил?Я также подумывал о создании совершенно новой модели для «видео», «подкастов» и «статей», но я бы предпочел этого избежать и использовать «Элемент» в качестве мощного типа контента на веб-сайте.

views.py

class ItemDetailView(generic.DetailView):
     model = Item
     if Item.type == 'video':
        template_name = 'curate/item_video.html'

models.py

class Item(models.Model):

    slug = models.SlugField(unique=True,max_length=1000)
    type = models.CharField(max_length=2000,
                            choices=type_choices,
                            default='article',
                            blank=True)

urls.py

path('<int:pk>/', views.ItemDetailView.as_view(), name='item_detail')

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

вы можете использовать self.get_object() из DetailView

, поэтому код будет выглядеть так:

def get_template_names(self):
    self.object = self.get_object()    
    if self.object.type == 'video':
        return ...
    else:
        return ...
0 голосов
/ 10 апреля 2019

Вы можете использовать метод get_template_names для возврата условных шаблонов.

class ItemDetailView(generic.DetailView):
     model = Item

    def get_template_names(self):
        item = self.get_object()
        if item.type == 'video':
            return ['curate/item_video.html']
        elif item.type == 'podcast':
            return ['curate/item_podcast.html']
        ...........................
        else:
            return ['curate/default.html']

Другой способ сделать это - передать объект Item в контексте и иметь условия в шаблоне.

...