如何让Django HTML的IF语句匹配当前URL的所有子路径?
好问题!你现在的代码逻辑有点小问题,而且确实可以用命名空间来更优雅地解决这个需求,下面给你两种可行的方案:
方案1:基于URL路径前缀匹配(简单直接)
首先得纠正你原代码的逻辑问题:你写的{% if request.get_full_path in "/chat/" %}搞反了判断方向——这个条件是在检查请求路径是否是"/chat/"的子字符串,而不是反过来。要匹配所有/chat/开头的子路径,应该用字符串的startswith()方法,而且推荐用request.path(不包含查询参数的纯路径部分)比get_full_path更准确:
{% if request.path.startswith('/chat/') %} <p>found it</p> {% endif %}
这样不管是/chat/1/1、/chat/members还是/chat/本身,只要路径以/chat/开头,都会触发这个条件。
方案2:利用URL命名空间(更健壮,推荐)
既然你已经给chat应用配置了namespace='chat',用命名空间判断会更灵活——哪怕以后你把chat的URL前缀从/chat/改成/messages/,模板代码也不用修改,完全解耦了URL前缀和模板逻辑。
在Django模板里,可以通过request.resolver_match对象获取当前视图的命名空间信息,直接判断是否属于chat命名空间:
{% if request.resolver_match.namespace == 'chat' %} <p>found it</p> {% endif %}
只要是chat应用下的任何URL(不管是根路径还是子路径),都会匹配这个条件。如果你的chat应用有嵌套的子命名空间(比如chat:sub),也可以用startswith来兼容:
{% if request.resolver_match.namespace.startswith('chat:') %} <p>found it</p> {% endif %}
个人更推荐方案2,完全符合Django的最佳实践,后续维护起来更省心。
内容的提问来源于stack exchange,提问作者Micah Pearce
相关产品推荐
相关产品推荐

