Python / Django / Jinja2:如何用另一个变量的值扩展变量名(例如在 for 循环中)?
Posted
技术标签:
【中文标题】Python / Django / Jinja2:如何用另一个变量的值扩展变量名(例如在 for 循环中)?【英文标题】:Python / Django / Jinja2: How to extend a variable name with the value of another variable (e.g. in a for-loop)? 【发布时间】:2020-02-07 05:34:50 【问题描述】:在我的django
db 模型中,我有例如5x ImageField
,我想在前端用作轮播:
slider_image_1 = models.ImageField(upload_to='images/', blank=True)
slider_image_2 = models.ImageField(upload_to='images/', blank=True)
slider_image_3 = models.ImageField(upload_to='images/', blank=True)
slider_image_4 = models.ImageField(upload_to='images/', blank=True)
slider_image_5 = models.ImageField(upload_to='images/', blank=True)
根据图像是否已上传,我想显示图像,我正在寻找类似于这样的方法:
% for FOO in range(5) %
% if object.slider_image_|extend_name_with:FOO %
<img src=" object.slider_image_|extend_name_with:FOO.url ">
% endif %
% endfor %
有类似的可能吗?解决这个问题还有什么其他好的方法?
【问题讨论】:
【参考方案1】:对于模板中的复杂逻辑,推荐的方法是在模型方法中编写逻辑,而不是在模板本身中。
在你的情况下,我认为这就是你想要的:
class SomeModel(models.Model):
slider_image_1 = models.ImageField(upload_to='images/', blank=True)
slider_image_2 = models.ImageField(upload_to='images/', blank=True)
slider_image_3 = models.ImageField(upload_to='images/', blank=True)
slider_image_4 = models.ImageField(upload_to='images/', blank=True)
slider_image_5 = models.ImageField(upload_to='images/', blank=True)
@property
def slider_images(self):
fields = [field.name for field in self._meta.get_fields()]
results = []
for field in fields:
if 'slider_image' in field:
data = getattr(self, field)
if data:
results.append(data.url)
return results
@property
def slider_images(self): # simplified version
results = [getattr(self, field.name) for field in self._meta.get_fields()
if 'slider_image' in field]
return [result.url for result in results if result]
现在您可以在模板中轻松访问此列表:
% for url in object.slider_images %
<img src=" url ">
% endfor %
这有点超出了这个问题的范围,但是您的 slider_image
字段看起来应该是一个 ManyToManyField
。在此处使用M2M
将大量简化您正在做的工作量,并完全消除对我的解决方案的需求。我无法真正为您提供使用此功能的解决方案,因为您可能需要在整个代码中更改几条逻辑,然后才能使用它。
【讨论】:
以上是关于Python / Django / Jinja2:如何用另一个变量的值扩展变量名(例如在 for 循环中)?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 jinja2 中使用 django 中的动态变量(variable.variable.variable)