Django查看/过滤器

时间:2013-11-01 17:04:44

标签: django filtering

我刚刚完成了Django教程,虽然对学习更多感到兴奋,但我并不精通。我想你可以说我现在还不知道是不是很危险。

假设我有一个音乐数据库。我有一个Artist模型,一个Album模型,一个流派模型和一个Song模型。我希望能够做的是根据给定的过滤器显示专辑(甚至是艺术家);所以我的前端会显示一个专辑列表,并提供一种过滤列表的方法。例如,“Jazz”链接仅显示Jazz专辑。很简单。

我可以想到几种方法来实现这一目标,但我想从右脚开始......开始形成“最佳实践”Django方法。我能想到的一种方法是写视图......这样/专辑/爵士只会显示爵士乐。另一种方法是编写过滤专辑的模型级方法。但是,在这里我对如何实际实现这样的过滤器有点模糊。

有人请详细介绍一下如何最好地完成这项任务吗?

1 个答案:

答案 0 :(得分: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文档中得到了很好的记录。