如何在 Django 2.1 中的模板内的 for 循环内设置变量?

Posted

技术标签:

【中文标题】如何在 Django 2.1 中的模板内的 for 循环内设置变量?【英文标题】:How to set a variable inside for loop inside template in Django2.1? 【发布时间】:2020-02-07 07:19:23 【问题描述】:

我有一个上下文字典,其中包含要传递给模板的数据。我需要根据我使用 % with % Django 模板标签实现的一些标志变量来切换两个 div。但是,当我尝试使用 % set % 语法设置变量时,出现以下错误:- set', expected 'endwith'. Did you forget to register or load this tag?

我遵循here 给出的解决方案,但它给了我错误。

index.html

% with flag=1 %
                % for benefit in content.benefits %
                    <div style="background-color: #fff;" class="row mt-5">
                        % if not flag %
                            <div class="col-lg-4 col-md-4 col-sm-12">
                                <img src="% static "benefit.image" %" 
                                     class="img-responsive mx-auto mt-5 w-100 h-75 h-md-50 working-img">
                            </div>
                        % endif %
                        <div class="col-lg-8 col-md-8 col-sm-12 h-100">
                            % for desc in benefit.heading %
                                <div class="d-flex h-25 w-100 m-1 mt-4">
                                    <div class="col-3 col-sm-2 h-100">
                                        <div class="mx-auto">
                                            <i class="fas fa-check fa-2x" style="color: #6fe33d"></i>
                                        </div>
                                    </div>
                                    <div class="col-9 col-sm-10">
                                        <div class="d-flex flex-column">
                                            <div class="working-caption font-weight-bold"> desc </div>
                                            #                                            <div class="py-2 working-description-courses text-muted"> description </div>#
                                        </div>
                                    </div>
                                </div>
                            % endfor %
                        </div>
                        % if flag %
                            <div class="col-lg-4 col-md-4 col-sm-12">
                                <img src="% static "benefit.image" %" 
                                     class="img-responsive mx-auto mt-5 w-100 h-75 h-md-50 working-img">
                            </div>
                        % endif %
                    </div>
                % endfor %
                % set flag=1-flag %
            % endwith %

settings.py

...
TEMPLATES = [
    
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': 
            'environment': 'myapp.jinja2.environment'
        ,
    ,
    
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': 
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        ,
    ,
]
...

【问题讨论】:

没有名为% set %AFAIK的标签 您确定您的 index.html 模板正在被 jinja2 处理吗?设置标签仅为 jinja2。模板的完整路径是什么? @FlipperPA 模板的完整路径是 - courses/template/courses/index.html @Moha369 我使用了% set %,因为我找不到任何类似的标签来更新DjangoTemplates 中的flag 变量 你应该看到文档,他们使用with 设置变量,检查内置标签中的with 【参考方案1】:

您尝试使用的命令 set 仅适用于 Jinja2 模板引擎,不适用于 Django 的模板引擎。

https://jinja.palletsprojects.com/en/2.10.x/templates/#assignments

由于您在设置中的 Jinja2 和 Django 模板引擎中都使用了 APP_DIRS 约定,因此您需要将所有 Jinja2 模板放入 courses/jinja2/courses/index.html 而不是 courses/template/courses/index.html。有关详细信息,请参见此处:

https://docs.djangoproject.com/en/2.2/topics/templates/#django.template.backends.jinja2.Jinja2

祝你好运!

【讨论】:

以上是关于如何在 Django 2.1 中的模板内的 for 循环内设置变量?的主要内容,如果未能解决你的问题,请参考以下文章

Django_模板

如何打破 Django 模板中的“for循环”

如何从 django 模板中的 for 循环中获取特定的 id?

如何打破 Django 模板中的“for循环”

Django模板中的for循环

如何在Django模板中显示数组值?