【问题标题】:Django views/templates: list filtering based on a current a site categoryDjango 视图/模板:基于当前站点类别的列表过滤
【发布时间】:2014-02-01 11:39:53
【问题描述】:

在我的应用中,用户可以创建和管理organizations -> projects -> resources 等等。 project 实例有一个指向organization 的外键,resource 有一个指向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' %}&amp;project={{ project_id }}。坏的。丑。

将最后选择的organization/project id 存储在缓存或会话中

易于使用。但不是用户显式的。此外,当站点在多个选项卡中打开并且在每个选项卡上选择了不同的组织时,它也会产生问题。

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

更新 2

如果它还不干净。项目或组织的选择——它实际上是在切换当前的显示上下文。在所选组织的上下文中,所有链接都应指向该组织中的项目,依此类推。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谢谢。另外,您如何看待在任何可能的地方用{{ model_instance.absolute_url }} 替换{% url view %} 标签?
    • 如果它提高了可读性,那就去吧。它还有助于将来更改 url,例如,如果您有项目 - 资源连接,并且您正在添加组织,如果模板使用 get_absolute_url,则无需更改模板,只需更改模型上的方法.
    猜你喜欢
    • 2020-09-25
    • 2015-08-10
    • 2018-11-19
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    • 2019-06-20
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多