使用点运算符访问字典时条件语句在 Django 模板中不起作用

Posted

技术标签:

【中文标题】使用点运算符访问字典时条件语句在 Django 模板中不起作用【英文标题】:Conditional Statement not working in Django template while accessing a dictionary with dot operator 【发布时间】:2020-08-10 23:27:29 【问题描述】:

如果文件 daily-yyyy-mm.csv 退出但它总是显示 Not Avaialable,我正在尝试提供下载选项 即使文件存在。

我在views.py 中创建了一个字典(file_list),如果文件存在,它会为该索引保存True。我检查了在 os.path.join 生成的路径,它是正确的,而且字典对存在的文件也有 True。我认为问题在于在模板中访问字典时使用了 2 个嵌套的点运算符。

模板

        % for upload in upload_list %
        <tr>
            %if file_list.upload.upload_report_date %
            <td><a href="%static 'media/daily- upload.upload_report_date|date:"Y-m" .csv" download >Download</a></td>

            % else %
            <td>Not Available</td>
            % endif %
        </tr>
        % endfor %

Views.py

    upload_list = Upload.objects.all().order_by('-upload_at')
    file_list=
    for upload in upload_list:
        try:
            if os.path.exists(os.path.join(settings.MEDIA_ROOT,'daily-%s.csv' % (upload.upload_report_date).strftime("%Y-%m"))):
                file_list[upload.upload_report_date]=True
        except:
            pass

我正在使用 python 2.7 和 django 1.6.7。

【问题讨论】:

什么是 file_list.upload.upload_report_date,当您只是在视图中渲染或打印它时? 如果我只是渲染它是空的。 【参考方案1】:

您当前尝试从模板中访问字典 file_listfile_list.uplad.upload_report_date

有了它,您将始终登陆else,因为您无法通过这种方式访问​​它。 您的代码尝试获取 file_list 的属性 upload,因为它不存在,所以总是返回 None

你可以做的是创建一个可用文件的列表(因为你已经调用了你的变量_list):

file_list = []
for upload in upload_list:
    try:
        if os.path.exists(...):
            file_list.append(upload.upload_report_date)
    except:
        pass

然后在你的模板中:

% if upload.upload_report_date in file_list %
...

【讨论】:

以上是关于使用点运算符访问字典时条件语句在 Django 模板中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

bash算数运算和条件测试语句

python基础:python循环三元运算字典文件操作

08 Django 模板进阶

Django模板进阶007

Django-jinjia2的赋值

Django里面的sql查询语句