Django:两种不同模型的分页

时间:2017-10-26 22:57:19

标签: python django pagination

我正在开发一个Django(v1.11.0)项目,我有两个名为Song的模型,其中包含用户歌曲和GenericSong,其中包含管理歌曲。

class Song(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    song_title = models.CharField(max_length=250)
    audio_file = models.FileField()
    is_favorite = models.BooleanField(default=False)

    def __str__(self):
        return self.song_title


class GenericSong(models.Model):
    album = models.ForeignKey(GenericAlbum, on_delete=models.CASCADE)
    song_title = models.CharField(max_length=250)
    audio_file = models.FileField(default='')
    is_favorite = models.BooleanField(default=False)

    def __str__(self):
        return self.song_title

我想列出数据库中包含用户和管理歌曲的所有歌曲,问题是,我想用分页列出。 我为一个只包含使用此视图的用户歌曲的页面做了这个,这很好用:

@login_required()
def songs(request, filter_by=None):

    users_songs = Song.objects.filter(album__user=request.user)
    page = request.GET.get('page', 1)
    if filter_by == 'favorites':
        users_songs = users_songs.filter(is_favorite=True)

    paginator = Paginator(users_songs, 10)
    try:
        songs_page = paginator.page(page)
    except PageNotAnInteger:
        songs_page = paginator.page(1)
    except EmptyPage:
        songs_page = paginator.page(paginator.num_pages)
    return render(request, 'music/songs.html', {
        'song_list': songs_page,
        'filter_by': filter_by,
    })

但是在第二种观点中,我不知道如何在一个变量中制作歌曲和genericsong以进行分页,这里是我要对其进行更改的所有歌曲视图:

@login_required()
def all_songs(request, filter_by=None):

    users_songs = Song.objects.all()
    generic_songs = GenericSong.objects.all()

    return render(request, 'music/songs.html', {
            'song_list_all': users_songs,
            'generic_song_list': generic_songs,
            'filter_by': filter_by,
    })

1 个答案:

答案 0 :(得分:1)

您有两个相同的型号。将它们合并为一个并添加类型:

app.post('/top', function (req, res) {
    var obj;
    fs.readFile('./object.json', 'utf8', function (err, data) {
        if (err) throw err;
        obj = JSON.parse(data);
        console.log(obj["fruit"]);
        console.log(obj["thyroid"]);
        res.render(
          'disp.ejs',
          { 
            food: obj["fruit"]
            name: obj["thyroid"]

          }); // render
    });
});

然后像往常一样用户Paginator进行过滤

class Song(models.Model):
    album = models.ForeignKey(Album, on_delete=models.CASCADE)
    song_title = models.CharField(max_length=250)
    audio_file = models.FileField()
    is_favorite = models.BooleanField(default=False)

    types = models.PositiveIntegerField(choices=SONG_TYPES, blank=True, null=True, default=1)

    def __str__(self):
        return self.song_title