在我的应用中,用户可以创建和管理organizations
- > projects
- > resources
等等。 project
实例的FK为organization
,resource
的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
。
此方法强制每次都在模板中传递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
易于使用。但不是用户明确的。当站点在多个选项卡中打开时,如果在每个选项卡上选择了不同的组织,它也会产生问题。
此刻我看到第一种方式看起来更好,但需要进行大量的重写工作。有没有更好的方法来进行基于类别/部分的过滤?
如果还不干净的话。选择项目或组织 - 它实际上是切换当前的显示上下文。在所选组织的上下文中,所有链接都应该导致该组织中的项目,等等。
答案 0 :(得分:2)
我个人更喜欢第一种方式。如果您的结构相对简单,则可以使用get_absolute_url
来简化模板。例如,{{ org.get_absolute_url }}
可能导致projects
视图,{{ prj.get_absolute_url }}
导致资源等。
在一个较旧的项目中,我使用会话方式,但仍然后悔,正是因为多个标签/窗口的问题。使用cookie有同样的问题。我认为第一种方式中URL配置的“丑陋性”值得获得可用性。