【问题标题】:django table cell color based on expression基于表达式的django表格单元格颜色
【发布时间】:2013-01-09 23:30:01
【问题描述】:

python 2.6,在 Redhat 6.3 上使用 Django 1.3.1

在 Django 中,我将如何根据其值更改表格单元格的背景颜色,例如超过 10 为红色,7 到 9 之间为橙色,低于 7 为绿色等。

数据来自非 django 数据库/模型。

我正在使用标准模板来迭代表格,但为此使用自定义模板没有问题。

我看到以下内容

Link

处理更改单元格颜色,但它似乎基于单元格中的具体值,而不是在一个范围内。

使用以下测试代码进行视图

def dashboard(request):
  if request.user.is_authenticated():
      user = request.user.first_name
  else:
      return redirect('/bcpm/login')


  table_headers = ['Colmun1','Column2','Column3']
  table_data = [['test1',2,3],['test2',2,4],['test3',5,5]]
  page_title = 'Dashboard'

  template_dict = {'header_list':table_headers, 'page_title':page_title,
                         'results':table_data,'username':user}
  return render_to_response('dashboard.html',template_dict)enter code here

以及以下通用表格模板:

<table border=1 width=98% style="margin-left:12px;">
        <tr>
            {% for item in header_list %}
            <th>{{ item }}</th>
            {% endfor %}
        </tr>


            {% for row in results %}
            <tr>
                {% for line in row %}
                <td>{{line}}</td>
                {% endfor %}
            </tr>
            {% endfor %}

    </table>

谢谢。


几乎解决了;

在下面的 brianbuck 的帮助下,我想出了以下内容, 在视图中:

def dashboard(request):
    if request.user.is_authenticated():
        user = request.user.first_name
    else:
       return redirect('/login'

    table_headers = ['Column1','Column2','Column3']
    table_data = [['name','thing',8],['name','thing',5]]
    page_title = 'Dashboard'

    template_dict = {'header_list':table_headers, 'page_title':page_title,
                         'results':table_data,'username':user}
    return render_to_response('dashboard.html',template_dict)

在模板中;

<table border=1 width=68% style="margin-left:12px;">
        <tr>
            {% for item in header_list %}
            <th>{{ item }}</th>
            {% endfor %}
        </tr>


            {% for element in results %}
          <tr>
            <td> {{ element.0 }} </td>
            <td> {{ element.1 }} </td>
            {% if element.3 > 7 %} <td class="red"> {{ element.3 }} </td> 
            {% else %} <td class="green"> {{ element.3 }} </td> {% endif %}
          </tr>
            {% endfor %}

    </table>
{% endif %}

我真的无法让它执行 {% if 或 %} 当我试图设置它做一个

"大于等于7或者小于等于8"

对于大于 7 的数字,它始终会计算为该表达式,即使第一个 if 语句对于大于 9 的数字应该为真。

我正在使用 Django 1.3,我认为 if/else 和多重评估可能存在一些限制,无论哪种方式,我都有 80% 使用红色/绿色两个值,目前这已经足够了。

谢谢大家。


让它像这样工作;

{% for element in results %}
            <tr>
            <td> {{ element.0 }} </td>
            <td> {{ element.1 }} </td>
            <td> {{ element.2 }} </td>
            <td> {{ element.3 }} </td>
            {% if element.4 > 8 %} <td class="red"> {{ element.4 }} </td>
            {% else %}{% if element.4 > 8 or element.4 >= 5 %} <td class="orange"> {{ element.4 }} </td>
            {%else %}{% if element.4 < 5 %}<td class="green"> {{ element.4 }} </td>
            {% endif %}{% endif %}{% endif %}

            <td> {{ element.5 }} </td>

如果您有支持 elif 的 Django 版本,或者您添加了一些可用于扩展 django 安装的 django sn-ps,则不需要这样做。

万岁。

【问题讨论】:

    标签: python django


    【解决方案1】:

    这假设您有三个名为:

    td.red {
        backgroundColor: red;
    }
    td.orange {
        backgroundColor: orange;
    }
    td.green {
        backgroundColor: green;
    }
    

    ...

    Django 1.3 没有elif,所以你可能不得不让它更笨重一些。

    <td class="
        {% if val >= 10 %}red{% endif %}
        {% if val >= 7 or val <= 9 %}orange{% endif %}
        {% if val < 7 %}green{% endif %}">
        {{ val }}
    </td>
    

    【讨论】:

    • 在 else 分支中的另一个 if 呢?
    • 我将该行作为一个列表发送到模板中,因此有文本列等。其中并非所有内容都是数字的,尽管显然该行中至少有一个列将是
    • @möter,这是一个有趣的问题,我想这取决于你喜欢的编码风格。
    • 如果我这样做 {% for row in results %} {% for line in row %} {{ line }} 我是没有得到颜色变化,所以我想我可能在 css 中的错误位置有定义,有一个表格部分,我在那里有它。抱歉,我正在使用我收到的 CSS。
    • @AlanEnnis,您可能必须想出一个自定义过滤器来测试该值是否为整数。
    【解决方案2】:

    我只想在 admin.py 中执行此操作。

    • 假设您的专栏名为col
    • 如果列的值大于 0,您希望将列设置为绿色,如果相反,则设置为红色。
    def TableAdmin(admin.ModelAdmin)
        def col_(self, obj):
            green_style = "<script>document.querySelectorAll('.green_table_elem').forEach(elem => { elem.parentElement.style.background = 'green'; })</script>"
            red_style = "<script>document.querySelectorAll('.red_table_elem').forEach(elem => { elem.parentElement.style.background = 'red'; })</script>"
            
            if obj.col > 0:
                return mark_safe(f'<div class="green_table_elem">{obj.col}</div> {green_style}')
            else:
                return mark_safe(f'<div class="red_table_elem">{obj.col}</div> {red_style}')
        
        list_display = ('col_',)
    

    这会为td(列)本身着色,而不是像某些答案那样为添加的 div 着色。

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签