Django模板无法识别getattr

h22fl7wq  于 2023-08-08  发布在  Go
关注(0)|答案(1)|浏览(136)

我想在HTML模板中显示dinamically一个表。在我看来:

def get_object( request ):
    objects = MyObject.objects.all()
    return render(request, 'table.html', { 'myObjects':objects, 'fields':ObjectAdmin.list_display})

字符串
然后在'table.html'中

<thead class="tables-success"> 
        <tr>
            {% for field in fields %}
                <th>{{ field }}</th>
            {% endfor %}            
        </tr>    
    </thead>
        {% for row in myObjects %}
            <tr>
                {% for field in fields %}
                <td>{{ getattr(row, field) }}</td>
                    <!--<td>{{ row|getattr:field }}</td>-->
                {% endfor %}
            </tr>
        {% endfor %}


在admin.py

class MyObjectAdmin(admin.ModelAdmin):
    list_display = [ 'name']#
    list_per_page = 8
    search_fields = [ 'name']
admin.site.register(  Object, MyObjectAdmin )


但我收到了以下错误:

Could not parse the remainder: '(row, field)' from 'getattr(row, field)'


或者是

Exception Value:    Invalid filter: 'getattr'


如果我使用

{{ row|getattr:field }}

zsohkypk

zsohkypk1#

Django的模板语言不允许调用任何方法(带括号,所以这意味着任何带参数的方法)。至于模板过滤器,你只能使用内置的[Django-doc],或者你注册的。
因此,很多人制作了一个自定义模板过滤器并注册了该过滤器。但这往往不是一个好主意:之所以不能做到这一点是有原因的:防止在模板中写入业务逻辑。
可以简单地预处理模板中的数据:

def get_object(request):
    objects = [
        [getattr(item, field) for field in ObjectAdmin.list_display]
        for item in MyObject.objects.all()
    ]
    return render(
        request,
        'table.html',
        {'myObjects': objects, 'fields': ObjectAdmin.list_display},
    )

字符串
然后在模板中使用:

<thead class="tables-success"> 
    <tr>
        {% for field in fields %}
            <th>{{ field }}</th>
        {% endfor %}            
    </tr>    
</thead>
<tbody>
    {% for row in myObjects %}
        <tr>
            {% for item in row %}
                <td>{{ item }}</td>
            {% endfor %}
        </tr>
    {% endfor %}
</tbody>


话虽如此,已经有很多库实现了您的目标,比如django-tables2 [readthedocs.io]。使用list_display也有一点风险,因为ModelAdmin允许向list_display添加函数,或者ModelAdmin本身定义的方法,因此没有说这些是对象属性的名称。

相关问题