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)

Jinja2 设置块在 Django 中无法识别

使用 jinja2 模板引擎渲染 django 表单

Jinja2 模板使用 Django 模板标签

[oldboy][初识django]之创建虚拟(干净)的Python环境[0]

如何在 Django 1.8 中使用 jinja2 作为模板引擎