2017-10-26 3 views
0

私はDjango(v1.11.0)プロジェクトに取り組んでいます。私は、ユーザーソングを含むソングと管理ソングを含むGenericSongという2つのモデルを持っています。Django:2つの異なるモデルのページ設定

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, 
    }) 

しかし、2番目のビューでは、私は1つの変数の中で歌とgenericsongを作る方法がわかりませんTHAページネーションを行い、ここですべての曲があり、私はそれに変更を加えたいと表示します。

@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

あなたは、2つの同一のモデルを持っています。 1にそれらを結合し、タイプを追加します。

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 

その後フィルタリング

admin_songs = Song.object.filter(type=1) 
other_songs = Song.object.filter(type=2) 
+0

といつものように、ユーザーページネータ、私は私のwesiteの全体のコードを変更する必要がありますので、私は、それを行うことができない、と私はほとんどなかったです仕事の99%は、モデルを変更せずにこれを行う他の方法ですか? – eliadesign

+1

https://stackoverflow.com/a/15597480/709897 Paginatorはリストを受け入れるので、2つのモデルをリストにまとめて共通の属性で簡単に並べ替えることができます。 –

+0

@eliadesignデータモデルの修正は、ハッキングを使用するよりもよいでしょう。 –

関連する問題