Django - есть ли более простой способ отображать страницы жанров фильмов с помощью DRY

Я создал веб-сайт с фильмами, используя Django 2.1, у меня есть несколько страниц для жанров Admin-top, Latest, Thriller, Horror, Action и т.д ... что нормально, но у меня есть еще 10+ жанров и 10+ лет, и я думая, что должен быть лучший способ, СУХОЙ способ, чтобы иметь отдельные страницы, когда макет страницы такой же, и т.д., это просто содержимое, которое меняется, как в моем подробном представлении .. У меня есть google, поиск и т.д., я не могу выяснить это. Любая помощь приветствуется

Вот мои взгляды

from django.shortcuts import render, get_object_or_404
from .models import Movie, Banner
from django.views.generic import ListView, DetailView



# Base page for pages.
def base(request):
    return render(request, 'movies/base.html')



# HOME-PAGE
class HomeListView(ListView):
    model = Movie
    template_name = 'movies/home.html' # <app>/<model>_<viewtype>.html

    def get_context_data(self, **kwargs):
        context = super(HomeListView, self).get_context_data(**kwargs)
        context['admin_movies'] = Movie.objects.filter(admin_top__contains='Yes').order_by('-date_posted')
        context['latest_movies'] = Movie.objects.all().order_by('-date_posted')
        context['thriller_movies'] = Movie.objects.filter(genre__contains='Thriller').order_by('-date_posted')
        context['horror_movies'] = Movie.objects.filter(genre__contains='Horror').order_by('-date_posted')
        context['action_movies'] = Movie.objects.filter(genre__contains='Action').order_by('-date_posted')
        # Add any other variables to the context here
        return context



# MOVIE DETAIL PAGE
class MovieDetailView(DetailView):
    model = Movie
    queryset = Movie.objects.all()
    template_name = 'movies/movie-detail.html'

    def get_object(self):
        title_ = self.kwargs.get('title')
        return get_object_or_404(Movie, title=title_)



# ADMIN MOVIE-PAGE
class AdminListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(admin_top__contains='Yes')
    template_name = 'movies/admin-top.html' 
    context_object_name = 'admin_movies'
    ordering = ['-date_posted']
    paginate_by = 2




# LATEST MOVIE-PAGE
class LatestListView(ListView):
    model = Movie
    template_name = 'movies/latest.html' 
    context_object_name = 'latest_movies'
    ordering = ['-date_posted']



# THRILLER MOVIE-PAGE
class ThrillerListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(genre__contains='Thriller')
    template_name = 'movies/thriller.html' 
    context_object_name = 'thriller_movies'
    ordering = ['-date_posted']



# ACTION MOVIE-PAGE
class ActionListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(genre__contains='Action')
    template_name = 'movies/action.html' 
    context_object_name = 'action_movies'
    ordering = ['-date_posted']



# HORROR MOVIE-PAGE
class HorrorListView(ListView):
    model = Movie
    queryset = Movie.objects.filter(genre__contains='Horror') # only for filter/query on field - no more at time with using this
    template_name = 'movies/horror.html' 
    context_object_name = 'horror_movies'

    ordering = ['-date_posted','genre']

Вот мои модели

из моделей импорта django.db

class Movie(models.Model):
    title = models.CharField(max_length=250)
    year = models.CharField(max_length=250, default='N/a')
    genre = models.CharField(max_length=250, default='N/a')
    country = models.CharField(max_length=250, default='N/a')
    duration = models.CharField(max_length=250, default='N/a')
    quality = models.CharField(max_length=250, default='N/a')
    director = models.CharField(max_length=250, default='N/a', null=True, blank=True)
    actors = models.CharField(max_length=250, default='N/a')
    country = models.CharField(max_length=250, default='N/a')
    imbd = models.CharField(max_length=250, default='N/a')
    date_posted = models.DateTimeField(auto_now_add=True)
    text = models.CharField(max_length=500, default=None, null=True, blank=True)
    admin_top = models.CharField(max_length=250, default=None, null=True, blank=True)
    banner_gif = models.CharField(max_length=250, default='N/a', null=True, blank=True)
    image_1 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    image_2 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    image_3 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    image_4 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    poster = models.CharField(max_length=1000, default=None, null=True, blank=True)
    trailer = models.CharField(max_length=1000, default=None, null=True, blank=True)
    server_1 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    server_2 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    server_3 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    server_4 = models.CharField(max_length=1000, default=None, null=True, blank=True)
    server_5 = models.CharField(max_length=1000, default=None, null=True, blank=True)

    def __str__(self):
        return '%s - %s' % (self.title, self.year)


class Banner(models.Model):
    title = models.CharField(max_length=250, default='N/a')
    admin_top = models.CharField(max_length=250, default=None, null=True, blank=True)
    genre = models.CharField(max_length=250)
    image = models.CharField(max_length=250)

    def __str__(self):
        return '%s - %s - %s' % (self.title, self.genre, self.image)

а вот мои URL

from django.urls import path
from .models import Movie
from .views import (
    HomeListView,
    MovieDetailView,
    AdminListView,
    LatestListView,
    ThrillerListView,
    HorrorListView,
    HomeListView,
    ActionListView,
    base
    )

urlpatterns = [
    path('', HomeListView.as_view(), name='movie-home'),
    path('movie-detail/<title>/', MovieDetailView.as_view(), name='movie-detail'),
    path('admin-top/', AdminListView.as_view(), name='movie-admin'),
    path('latest/', LatestListView.as_view(), name='movie-latest'),
    path('thriller/', ThrillerListView.as_view(), name='movie-thriller'),
    path('horror/', HorrorListView.as_view(), name='movie-horror'),
    path('action/', ActionListView.as_view(), name='movie-action'),
    path('base/', base, name='movie-base'),
]
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
593
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Создайте класс с именем, например. GenreListView, который является подклассом ListView. У всех других жанровых страниц есть подкласс GenreListView. Вынесите все общие логические переменные / переменные-члены как часть GenreListView вместо того, чтобы помещать их в классы, которые унаследованы от него. Например, все они используют model = Movie, поэтому установите его на GenreListView.

Если вы хорошо знакомы с ООП Python, вы можете довести это до логической крайности и исключить многие вещи, которые могут быть не так очевидны, как model = Movie. Например, вы можете создать метод-заглушку (например, get_qs_filter()) в суперклассе, который возвращает фильтр для использования при формировании набора запросов. Заглушка сама по себе ничего не делает, а вместо этого унаследованные от нее классы реализуют метод. Но суперкласс, тем не менее, может вызвать get_qs_filter(), передать его в Movie.objects.filter и установить равным переменной-члену queryset.

Ответ принят как подходящий

Нет необходимости в отдельных представлениях. URL-адрес должен захватывать ключевое слово жанра, затем ваше представление использует его в методе get_queryset для получения соответствующих фильмов.

path("<str:genre>", GenreListView ...)

...

class GenreListView(ListView):
    model = Movie

    def get_queryset(self):
        return Movie.objects.filter(genre__contains=self.kwargs["genre"])

Это то, что искал / думал, спасибо !, хотя я продолжаю получать эту ошибку при попытке реализовать это «Обратный для« детали фильма »с аргументами ключевого слова« {'жанр': ''} »не найден. Пробовали 1 шаблон (ы): ['movie \\ - detail \\ / (? P <title> [^ /] +) \\ / $'] '

n c 27.10.2018 11:26

Да, удалось разобраться, к счастью, я храню 3 резервные копии, так как в первый раз это немного запуталось, спасибо :) действительно СУХОЕ и намного проще. Благодарность

n c 27.10.2018 11:53

Другие вопросы по теме