Django视图/模板:根据当前的站点类别列出过滤

时间:2014-01-13 16:20:54

标签: django django-templates django-urls django-filters

在我的应用中,用户可以创建和管理organizations - > projects - > resources等等。 project实例的FK为organizationresource的FK为project

例如,当用户选择活动组织时,我希望projects视图仅显示属于该组织的项目。我看到了这些方式:

所有特定网址中的可选参数

url(r'^(?:organization/(?P<organization_id>\d+)/)?projects/$', 'app.views.projects', name='projects'),
url(r'^(?:organization/(?P<organization_id>\d+)/)?(?:project/(?P<project_id>\d+)/)?resources/$', 'app.views.resources', name='resources'),

此外,此方法强制重写模板中的所有{% url %}标记:

`{% url 'projects' org.id %}` 
`{% url 'resources' org.id  prj.id %}` 

但这一切看起来并不漂亮,尤其是urls.py

更新1

此方法强制每次都在模板中传递organization_id 。即使我编写中间件以避免在上下文中传递它,

class FetchFiltersMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        request.project_id = view_kwargs.get('project_id', 0)
        request.organization_id = view_kwargs.get('organization_id', 0)

无论如何,必须重写所有网站网址以包含organization_id,否则过滤将被破坏。即使没有必要,即在用户个人资料视图中,projects的所有侧边栏链接都将被破坏。

在Cookie或GET参数中存储当前过滤器

喜欢{% url 'myurl' %}&project={{ project_id }}。坏。难看。

在缓存或会话中存储上次选择的organization / project个ID

易于使用。但不是用户明确的。当站点在多个选项卡中打开时,如果在每个选项卡上选择了不同的组织,它也会产生问题。

此刻我看到第一种方式看起来更好,但需要进行大量的重写工作。有没有更好的方法来进行基于类别/部分的过滤?

更新2

如果还不干净的话。选择项目或组织 - 它实际上是切换当前的显示上下文。在所选组织的上下文中,所有链接都应该导致该组织中的项目,等等。

1 个答案:

答案 0 :(得分:2)

我个人更喜欢第一种方式。如果您的结构相对简单,则可以使用get_absolute_url来简化模板。例如,{{ org.get_absolute_url }}可能导致projects视图,{{ prj.get_absolute_url }}导致资源等。

在一个较旧的项目中,我使用会话方式,但仍然后悔,正是因为多个标签/窗口的问题。使用cookie有同样的问题。我认为第一种方式中URL配置的“丑陋性”值得获得可用性。