假設你知道如何將一個項目中構建的應用程序(即教程教什麼的),你可以沿着這個例子與例子models.py
,urls.py
和views.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文檔中有很好的記錄。
非常感謝。我唯一無法理解的行是:'context = super(ListAlbumsByGenreView,self).get_context_data(** kwargs)' – user2945742
'get_context_data'是'ListView'類的繼承方法;你必須調用它的'super'父類方法,以便用父函數返回的任何上下文啓動上下文。例如,如果ListView在上下文中設置了page_no,則該調用可確保實際發生。請注意,這只是一個例子。在這種情況下,我只是爲了遵循最佳實踐(你也應該這樣做)。 –