django表格单元格基于表达式

时间:2013-01-25 22:24:55

标签: python django

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的值都应为true。

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

谢谢大家。


让它像这样工作;

{% 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片段,则不需要这样做。

乌拉。

2 个答案:

答案 0 :(得分:3)

这假设您有三个名为的类:

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>

答案 1 :(得分:0)

我只想在admin.py中这样做。

  • 假设您的列名为col
  • 您希望将其值设置为大于0的列设置为绿色,如果相反则为true。
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着色。