如何在自定义模板标签中传递 url 标签?

Posted

技术标签:

【中文标题】如何在自定义模板标签中传递 url 标签?【英文标题】:How to pass an url tag in a custom template tag? 【发布时间】:2017-05-29 00:38:55 【问题描述】:

我正在学习 Django 构建一个小型站点,我发现我有很多模板用于列出对象,每个模板都有指向它的链接。 我想我可以制作一个自定义模板标签,比如

% object_list some %

some 是字典 'list': obj_list, 'link': link 其中obj_list 是我要打印的对象列表,link 应该是指向该项目的一些 url 结构。

模板(称为object_list.html)应该看起来像

% for object in object_list %
    <li><a href="% url myapp:object object.id %">object.name</a></
% endfor %

现在,我的问题是我不知道在 url 中做什么。我希望它灵活一些,例如,将 'myapp:object' 替换为参数 'link',例如,如果对象类型是 User,那么我使用 %url myapp:user user.id%

可以这样做吗?怎么样?

我尝试了this solution,格式为

% for object in object_list %
    % url 'link' as my_url %
    <li><a href="% url my_url object.id %">object.name</a></li>
% endfor %

'myapp:myobject' 作为参数,但它不起作用。准确地说,在模板中

% load property_extras %
% object_list property_dict %

property_dict 是我的参数,templatetag/property_extras.py 是保存标签的文件,会给出 NoReverseMatch 错误(如果我使用普通模板 - 没有自定义标签 - 它工作正常)。

更多信息,我的模板标签是

@register.inclusion_tag('properties/object_list.html')
def object_list(object_dict):
    print(object_dict['list'])
    print(object_dict['link'])
    return 
        'object_list': object_dict['list'],
        'link': object_dict['link'],
        

【问题讨论】:

【参考方案1】:

相信你可以使用

% for object in object_list %
    <li><a href=" object.get_absolute_url ">object.name</a></li>
% endfor %

并完全删除 % url % 的使用。为您的模型定义方法get_absolute_url 是根据documentation 解决问题的推荐方法。

【讨论】:

【参考方案2】:

使用% url 'link' as my_url % 不起作用,因为您使用的是文字字符串'link',并且您没有包含对象ID。你的意思是:

% url link object.id as my_url %

不清楚为什么将结果保存到my_url,因为您不会在任何地方使用my_url。也许您希望下一行是:

<a href=" my_url ">object.name</a></li>

但是,我认为您在这里并不需要as my_url。它默默地吞下你可能不想要的错误。这样做会更简单:

<a href="% url link object.id as my_url %">object.name</a></li>

【讨论】:

以上是关于如何在自定义模板标签中传递 url 标签?的主要内容,如果未能解决你的问题,请参考以下文章

织梦CMS如何在自定义表单页调用arclist标签啊,怎么在自定义表单页调用无效!

Django - 自定义模板标签传递关键字参数

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?

IOS Segue 在自定义标签栏中不起作用

iOS - 如何在自定义单元格中使用继承?

如何在自定义 django 表单中隐藏 django 标签?