Как можно осуществить рефакторинг представления?

Есть две простые модели:
models.py
class Author(models.Model):
	name = models.CharField(max_length=255)
	author_slug = models.SlugField(unique=True)

class Song(models.Model):
	name = models.CharField(max_length=255)
	song_slug = models.SlugField(unique=True)
	song_author = models.ForeignKey(Author)


и два представления:
views.py
class SongListView(ListView):
	model = Song
	context_object_name = 'songs_list'
	template_name = 'songs_list.html'

	def get_queryset(self):
		queryset = super(SongListView, self).get_queryset()
		paginator = Paginator(queryset, 10)
		page = self.request.GET.get('page')
		try:
			queryset = paginator.page(page)
		except PageNotAnInteger:
			queryset = paginator.page(1)
		except EmptyPage:
			queryset = paginator.page(paginator.num_pages)
		return queryset

class AuthorSongListView(SongListView):

	def get_queryset(self):
		queryset = super(SongListView, self).get_queryset()
		author = Author.objects.get(author_slug=self.kwargs.get('author_slug'))
		paginator = Paginator(queryset.filter(song_author=author), 10)
		page = self.request.GET.get('page')
		try:
			queryset = paginator.page(page)
		except PageNotAnInteger:
			queryset = paginator.page(1)
		except EmptyPage:
			queryset = paginator.page(paginator.num_pages)
		return queryset


Первое представление выводит список абсолютно все песен, по 10шт на страницу. Второе выводит по 10 песен на страницу, но принадлежащих определенному исполнителю. Можно ли как-то улучшить второе представление, а то выходит, что я повторяюсь в написании пагинации?
  • Вопрос задан
  • 116 просмотров
Решения вопроса 2
@deliro
Я бы посоветовал логику пагинатора использовать нативную для ListView.
class SongListView(ListView):
    model = Song
    context_object_name = 'songs_list'
    template_name = 'songs_list.html'
    paginate_by = 10

class AuthorSongListView(SongListView):
    def get_queryset(self):
        queryset = super(SongListView, self).get_queryset()
        author = Author.objects.get(author_slug=self.kwargs.get('author_slug'))
        return queryset.filter(song_author=author)
Ответ написан
Комментировать
sim3x
@sim3x
page = self.request.GET.get('page', 0)

https://docs.djangoproject.com/en/1.9/ref/class-ba...

Если нужно возвращать 404 если страница не существует, то ничего делать не нужно, а если не хочешь 404 - в темплейте укажи, что должно появиться на странице если список пуст

def get_queryset(self):
    queryset = super(SongListView, self).get_queryset()
    author = Author.objects.get(author_slug=self.kwargs.get('author_slug'))
    paginator = Paginator(queryset.filter(song_author=author), 10)
    return paginator.page(self.request.GET.get('page', 0))


Лучше не использовать исключения в местах, где их можно часто словить - лучше if
Так будет слегка быстрее
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы