【问题标题】:Django views/filtersDjango 视图/过滤器
【发布时间】:2013-11-12 22:32:43
【问题描述】:

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

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

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

谁能给我大致介绍一下如何最好地完成这项任务?

【问题讨论】:

    标签: django filtering


    【解决方案1】:

    假设您知道如何在项目中构建应用程序(即本教程教授的内容),您可以使用示例 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 文档中得到了很好的记录。

    【讨论】:

    • 非常感谢。我无法理解的唯一一行是:'context = super(ListAlbumsByGenreView, self).get_context_data(**kwargs)'
    • get_context_dataListView类的继承方法;您必须调用其 super 父方法,以便使用父函数返回的任何上下文来启动上下文。例如,如果ListView 在上下文中设置page_no,则此调用确保这确实发生。请注意,这只是一个示例。在这种情况下,我这样做只是为了遵循最佳实践(您也应该这样做)。
    猜你喜欢
    • 1970-01-01
    • 2018-10-05
    • 2018-09-02
    • 1970-01-01
    • 2023-01-15
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多