如果页面未发布,请转到下一个可用页面

If page is unpublished go to the next available page

我正在使用 Django 创建网络漫画。我的模型中有一个状态选择字段:1 表示发布页面,0 表示取消发布。

STATUS = (
(0,"Draft"),
(1,"Publish"))

我创建了两个函数:第一个转到上一页,第二个转到下一页。

def get_previous(self):
    previous = Page.objects.filter(status=1).get(number=self.number - 1)
    if previous.number > 0:
        return reverse('comic_page', args=[previous.chapter.slug, previous.number])
    return None

def get_next(self):
    last = Page.objects.filter(status=1).last()
    next = Page.objects.filter(status=1).get(number=self.number + 1)
    if next.number <= last.number:
        return reverse('comic_page', args=[next.chapter.slug, next.number])
    return None

当所有页面都发布时,它按预期工作,但是当其中一个页面被取消发布时,它不会转到下一个可用页面,而只是刷新页面。

我尝试创建另一个仅包含未发布页面的查询集,然后检查该页面是否存在于该查询集中并跳转 2 个页码而不是 1 个,但它不起作用。

def get_previous(self):
    previous = Page.objects.filter(status=1).get(number=self.number - 1)
    unpublished = Page.objects.filter(status=0)
    if previous in unpublished:
        previous = Page.objects.filter(status=1).get(number=self.number - 2)
        return reverse('comic_page', args=[previous.chapter.slug, previous.number])

    if previous.number > 0:
        return reverse('comic_page', args=[previous.chapter.slug, previous.number])
    return None

如有任何建议,我们将不胜感激,谢谢!

而不是使用 get 并在 number 上进行 精确 查找,而是 小于 大于 查找 (lt / gt lookups) on the number with an ordering and use the first / last methods:

def get_previous(self):
    previous = Page.objects.filter(status=1, number__lt=self.number).order_by('number').last()
    if previous is not None:
        return reverse('comic_page', args=[previous.chapter.slug, previous.number])
    return None

def get_next(self):
    next = Page.objects.filter(status=1, number__gt=self.number).order_by('number').first()
    if next is not None:
        return reverse('comic_page', args=[next.chapter.slug, next.number])
    return None