如何在Django模板中访问Python f-string组合变量内的子变量?
解决方案
方法一:后端拆分后传递变量(推荐)
不在模板里处理字符串拆分,直接在视图或数据处理环节把item字符串拆分成独立变量,再传递到模板:
# 假设你在视图中获取了拼接后的item字符串 item_str = item.item # 对应模板里的{{ item.item }} # 拆分字符串 parts = item_str.split('_') # 提取对应部分(索引0是item_id,1是flavour,2是strength) flavour = parts[1] strength = parts[2] # 将这两个变量加入模板上下文 context.update({ 'flavour': flavour, 'strength': strength, # 其他上下文变量... })
模板中直接使用变量:
<td class="py-3"> <p class="my-0"><strong>{{ item.product.name }}</strong></p> <p class="my-0"><strong>Flavour:</strong>{% if item.product.has_flavours %}{{ flavour|upper }}{% else %}N/A{% endif %}</p> <p class="my-0"><strong>Strength:</strong>{% if item.product.has_flavours %}{{ strength|upper }}{% else %}N/A{% endif %}</p> </td>
方法二:模板中使用自定义split过滤器拆分
如果不想修改后端逻辑,可以在Django模板中通过自定义过滤器拆分字符串:
步骤1:创建自定义过滤器
在你的Django应用下新建templatetags/custom_filters.py文件,内容如下:
from django import template register = template.Library() @register.filter(name='split') def split_string(value, separator): """拆分字符串的自定义过滤器""" return value.split(separator)
步骤2:模板中使用
在模板顶部加载过滤器,然后拆分字符串提取对应部分:
{% load custom_filters %} <td class="py-3"> <p class="my-0"><strong>{{ item.product.name }}</strong></p> {% if item.product.has_flavours %} {% with item_parts=item.item|split:"_" %} <p class="my-0"><strong>Flavour:</strong>{{ item_parts.1|upper }}</p> <p class="my-0"><strong>Strength:</strong>{{ item_parts.2|upper }}</p> {% endwith %} {% else %} <p class="my-0"><strong>Flavour:</strong>N/A</p> <p class="my-0"><strong>Strength:</strong>N/A</p> {% endif %} </td>
方法三:优化数据结构(长期最优)
如果可以修改数据模型或数据对象,建议保留item_id、flavour、strength三个独立字段,同时提供拼接后的item属性,避免后续拆分的麻烦:
比如在模型中定义:
from django.db import models class YourItemModel(models.Model): item_id = models.CharField(max_length=64) flavour = models.CharField(max_length=64) strength = models.CharField(max_length=64) product = models.ForeignKey(Product, on_delete=models.CASCADE) # 其他字段... @property def item(self): """返回拼接后的字符串""" return f'{self.item_id}_{self.flavour}_{self.strength}'
模板中直接访问独立字段:
<td class="py-3"> <p class="my-0"><strong>{{ item.product.name }}</strong></p> <p class="my-0"><strong>Flavour:</strong>{% if item.product.has_flavours %}{{ item.flavour|upper }}{% else %}N/A{% endif %}</p> <p class="my-0"><strong>Strength:</strong>{% if item.product.has_flavours %}{{ item.strength|upper }}{% else %}N/A{% endif %}</p> </td>
内容的提问来源于stack exchange,提问作者ladcode2022
相关产品推荐
相关产品推荐

