【问题标题】:Filter content by url segments按 url 段过滤内容
【发布时间】:2013-09-21 04:38:55
【问题描述】:

我有一个电影和电视节目的数据库。我想像这样过滤这些: /productions/ = 索引(全部),/productions/films/ = 仅电影,/productions/series/ = 仅电视节目

## urls.py
from django.conf.urls import patterns, url

from productions import views

urlpatterns = patterns('',
    url(r'^$', views.IndexView.as_view(), name='index'),
    url(r'^films/$', views.IndexView.as_view(), name='films'),
    url(r'^series/$', views.IndexView.as_view(), name='series'),
)

## views.py
from django.shortcuts import render, get_object_or_404
from django.http import HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse
from django.views import generic

from productions.models import Production, Director

class IndexView(generic.ListView):
    template_name = 'productions/index.html'
    context_object_name = 'productions_list'

    def get_queryset(self):
        return Production.objects.order_by('-release')

这样的最佳做法是什么?在 views.py 中为每个方法创建一个新方法,或者我可以重用 main 方法,并通过某种方式解析 URL 段来调用类似 if(productions.is_movie) 的方法?

【问题讨论】:

    标签: django python-3.x django-templates django-views


    【解决方案1】:

    我会从 url 中捕获字符串,如下所示:

    urlpatterns = patterns('',
        url(r'^(?<query>(films|series|))/$', views.IndexView.as_view(), name='films_series'),
    )
    

    然后,在get_queryset() 方法中,我会检查您是否需要归还所有电影或连续剧:

    class IndexView(generic.ListView):
        template_name = 'productions/index.html'
        context_object_name = 'productions_list'
    
        def get_queryset(self):
            # analyze `self.kwargs` and decide should you filter or not, just for example:
            is_all = self.kwargs['query'] == ''
            is_movie = self.kwargs['query'] == 'films' 
            is_series = self.kwargs['query'] == 'series'
    
            return Production.objects.order_by('-release')  # TODO: filter movies or series
    

    【讨论】:

      猜你喜欢
      • 2014-04-06
      • 2018-12-23
      • 2012-12-04
      • 1970-01-01
      • 2020-05-19
      • 2021-01-20
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      相关资源
      最近更新 更多