Python / Django / Jinja2:如何用另一个变量的值扩展一个变量名(例如在for循环中)?



在我的django数据库模型中,我有例如 5xImageField,我想将其用于前端的轮播:

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 %}

类似的事情可能吗?解决这个问题还有其他好方法吗?

对于模板中的复杂逻辑,建议的方法是在模型方法中编写逻辑,而不是在模板本身中编写逻辑。

就您而言,我认为这就是您想要的:

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大大简化您正在执行的工作量,并完全消除对我的解决方案的需求。 我真的不能给你一个使用它的解决方案,因为你可能需要在整个代码中更改几段逻辑才能工作。

最新更新