2013-11-01 179 views
3

我剛剛完成了Django的教程,雖然很興奮學習更多,但我絕不精通。我想你可以說在這一點上我不夠危險。Django的意見/過濾器

假設我有一個音樂數據庫。我有Artist模型,Album模型,Genre模型和Song模型。我希望能夠做的是根據給定的過濾器顯示專輯(甚至藝術家);所以我的前端會顯示一張相冊列表並提供過濾列表的方法。例如,「爵士」鏈接只會顯示爵士專輯。夠簡單。

我可以想到一些方法來實現這一點,但我想從右腳開始...開始形成「最佳實踐」的Django方法。我能想到的一種方式是編寫視圖......例如/ albums/jazz只會顯示爵士樂。另一種方法是編寫過濾相冊的模型級方法。然而,在這裏,我對如何實際實現這樣的過濾器有點模糊。

有人請給我一個關於如何完成這個任務的廣泛概述嗎?

回答

2

假設你知道如何將一個項目中構建的應用程序(即教程教什麼的),你可以沿着這個例子與例子models.pyurls.pyviews.py工作,爲您的示例應用程序myapp

models.py

class Genre(models.Model): 
    name = models.CharField(unique=True) # set name to be unique 
    ... 

class Album(models.Model): 
    genre = models.ForeignKey(Genre) 
    ... 

urls.py

urlpatterns = patterns('', 
    ... 
    url(
     r'^albums/(?P<genre>[-\w]+)/$', 
     ListAlbumsByGenreView.as_view(), name='list_albums_by_genre_view' 
    ), 
    ... 
) 

注意genre參數作爲URL圖案唯一的參數。

views.py使用ListView

from django.shortcuts import get_object_or_404 
from django.views.generic.list import ListView 

from myapp.models import Album, Genre 

class ListAlbumsByGenreView(ListView): 

    model = Album 

    def get_context_data(self, **kwargs): 
     context = super(ListAlbumsByGenreView, self).get_context_data(**kwargs) 
     # fetch the genre; if genre not found, an HTTP 404 is returned 
     genre = get_object_or_404(Genre, name=kwargs['genre']) 
     # filter the albums by genre 
     context['albums'] = Album.objects.filter(genre=genre) 
     return context 

以上的ListView把albums在你的HTML模板的上下文;這包含按流派過濾的相冊列表。

上面使用的單獨導入的函數都在Django文檔中有很好的記錄。

+0

非常感謝。我唯一無法理解的行是:'context = super(ListAlbumsByGenreView,self).get_context_data(** kwargs)' – user2945742

+0

'get_context_data'是'ListView'類的繼承方法;你必須調用它的'super'父類方法,以便用父函數返回的任何上下文啓動上下文。例如,如果ListView在上下文中設置了page_no,則該調用可確保實際發生。請注意,這只是一個例子。在這種情況下,我只是爲了遵循最佳實踐(你也應該這樣做)。 –