Я создал веб-сайт с фильмами, используя 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'),
]
Создайте класс с именем, например. 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"])
Да, удалось разобраться, к счастью, я храню 3 резервные копии, так как в первый раз это немного запуталось, спасибо :) действительно СУХОЕ и намного проще. Благодарность
Это то, что искал / думал, спасибо !, хотя я продолжаю получать эту ошибку при попытке реализовать это «Обратный для« детали фильма »с аргументами ключевого слова« {'жанр': ''} »не найден. Пробовали 1 шаблон (ы): ['movie \\ - detail \\ / (? P <title> [^ /] +) \\ / $'] '