gpt4 book ai didi

django - 将列表作为参数传递给 django 标签

转载 作者:行者123 更新时间:2023-12-01 11:15:29 25 4
gpt4 key购买 nike

我在 Django 中有一个自定义包含标签,我需要将一个列表作为参数传递给那里。大致如下:

 {% my_tag paramA='asdf' paramB='fdsa' listparams=['X', 'Y'] %}

这当然行不通,因为 Django 不知道如何处理以这种方式传递的列表。

我还可以捕获诸如 list_ 之类的一般内容,然后将它们组合成服务器端的列表:

 {% my_tag paramA='asdf' paramB='fdsa' list_1='X' list_2='Y' list_3='Z' %}

但我想知道是否有更好的方法来处理这个问题。

最佳答案

这里基本上有两种方法:

  1. 尝试构造一个列表,以一种或另一种方式,并将其传递给my_tag;或
  2. 更改 my_tag 以便传递列表更方便。

构建列表

Django 模板提供了构建列表的方法,尽管其中大多数都相当有限。

使用 make_list 模板过滤器

例如 Django 引入了一个 make_list template filter [Django-doc]这需要一个可迭代的,并将其转换为项目列表。例如,我们可以使用模板过滤器:

{% my_tag paramA='asdf' paramB='fdsa' listparams=<b>'XY'|make_list</b> %}

但是这样做有两个潜在的问题:(1) 对于字符串,它会遍历字符,因此元素都是 1 字符的字符串,以及 (2) 你不能构造包含整数等的列表。除非您已经有一个类似集合的对象,但这基本上会使 make_list 无用。

使用 .split()

我们可以通过调用.split()来解决它只需要1个字符的问题,这仅适用于字符串(除非变量的类型也支持.split() 函数),所以我们可以通过以下方式解决多字符部分的问题:

{% my_tag paramA='asdf' paramB='fdsa' listparams=<b>'XY Z'.split</b> %}

实现自定义可变参数标签来构造列表

我们还可以定义一个可变参数标签,它首先构造一个列表。我们通过实现一个自定义标签来做到这一点:

#  app/templatetags/create_list.py

from django import template

register = template.Library()

@register.simple_tag
def create_list(*args):
return args

然后我们可以使用两个步骤来传递一个列表:

{% load <b>create_list</b> %}
{% create_list 'X' 'Y' as <b>mylist</b> %}
{% my_tag paramA='asdf' paramB='fdsa' listparams=<b>mylist</b> %}

更改 my_tag

也许一种简洁的方法是在此处使用 positional 参数来获取列表。 Python 中的函数有两种类型的参数:positional 参数(传递 参数名称的参数)和 named 参数( key=...)。

因此,我们可以在这里使用位置的列表,从而调用标签:

{% my_tag <b>'X' 'Y'</b> paramA='asdf' paramB='fdsa' %}

如果我们没有提及任何位置参数,则列表因此被认为是空的。我们可以传递任意数量的参数。

例如,我们可以将标签实现为:

#  app/templatetags/my_tag.py

from django import template

register = template.Library()

@register.simple_tag
def my_tag(<b>*listparams</b>, paramA=None, paramB=None):
# ... processing
return None

这种方法的一个潜在问题是我们只能执行这个“技巧”一次,因为我们不能定义两个单独的这样的 *arg。我们当然可以将 *args 分成两个列表,但这可能很棘手。

关于django - 将列表作为参数传递给 django 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52058625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com