【问题标题】:Django : Listing model field names and values in template [duplicate]Django:在模板中列出模型字段名称和值
【发布时间】:2023-07-28 17:12:02
【问题描述】:

可能重复:
Django - Iterate over model instance field names and values in template

嗨,

我正在尝试在模板中列出通用 Django 模型的字段和相应值。但是,对于一个相当普遍的问题,我找不到内置的解决方案。我非常接近解决方案,但找不到出路。

view.py 代码:

def showdetails(request, template):
    objects = newivr1_model.objects.all()
    fields = newivr1_model._meta.get_all_field_names()
    return render_to_response(template, {'fields': fields,'objects':objects},
        context_instance=RequestContext(request))

模板代码:

    <table>                                                                                                                                       
    {% for object in objects %}                                                 
        <tr>                                                                    
            {% for field in fields %}                                           
                <td>                                                            
            <!--    {{ object.field }} /*This line doesn't work*/ -->                                           
                </td>                                                           
            {% endfor %}                                                        
        </tr>                                                                   
    {% endfor %}                                                                
    </table>

在注释的模板行我应该做什么才能获得 Object.field 的值?

也欢迎任何更好的 DRY 方法。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    很遗憾,您不能在模板引擎中进行类似的查找。

    您必须在视图中处理它。

    def showdetails(request, template):
        objects = newivr1_model.objects.all()
    
        for object in objects:
            object.fields = dict((field.name, field.value_to_string(object))
                                                for field in object._meta.fields)
    
       return render_to_response(template, { 'objects':objects },
                                        context_instance=RequestContext(request))
    

    模板

    {% for object in objects %}
        <tr>
        {% for field, value in object.fields.iteritems %}
            <td>{{ field }} : {{ value }}</td>
        {% endfor %}
        </tr>
    {% endfor %}
    

    【讨论】:

    • 不确定是不是我做错了什么,我收到了错误'Model' object is not iterable
    【解决方案2】:

    您需要创建自己的过滤器,它的工作方式类似于 python 中的 getattr 并在模板中使用它:

    {{ object|getattribute:field }}
    

    这里有描述如何做到这一点:Performing a getattr() style lookup in a django template

    但我认为这并不是一个好主意。 Insted 尝试在视图中执行此逻辑,如下所示:

    object_values = []
    for object in objects
       object_values.append([])
       for field in fields:
           object_values[-1].append(getattr(object, field))
    return render_to_response(template, {'object_values': object_values},
            context_instance=RequestContext(request))
    

    在模板中:

    <table>                                                                                                                                       
    {% for values in object_values %}                                                 
        <tr>                                                                    
            {% for value in values %}                                           
                <td>                                                            
                    {{ value }}
                </td>                                                           
            {% endfor %}                                                        
        </tr>                                                                   
    {% endfor %}                                                                
    </table>
    

    Django 模板系统没有提供很多功能(过滤器),因为您应该在视图中执行所有逻辑。模板应该只显示数据。

    【讨论】:

    • gruszczy - 我只是想在模板中呈现数据:)。从理论上讲,这也应该是一个相当简单和常见的问题。
    • 那么使用 getattr 过滤器应该会对您有所帮助。我相信这是一个普遍的问题。
    最近更新 更多