将 Django 模型输出为表格

问题描述 投票:0回答:6

我有一个视图定义(尝试)将模型输出为表格。这是我到目前为止所拥有的:

def output_table(request):
    output = My_Model()
    return render_to_response('outputtable.html', {'output': output})

这是 outputtable.html 的 HTML:

<html>
<table>
    {{ output.as_table }}
</table>
</html>

我做错了什么?这不起作用。现在,它正确地传递了模型,因为如果我将

My_Model()
更改为
My_Model.objects.all()
,然后将其简单地输出为
{{ output }}
,那么它会向我显示我将在 Django shell 中看到的内容。

django html-table model
6个回答
2
投票

所以你需要做的是以下几点:

1) 添加

from django.forms import ModelForm
到你的models.py

2)添加

class My_Model_Form(ModelForm):  
           class Meta:  
               model = My_Model 

3) 在你的views.py中,将

output = My_Model()
更改为
output = My_Model_Form()

现在一切都准备好了。因此,诀窍是从原始模型继承您的表单。


2
投票

models.Model
类没有像
as_table()
类那样的方法
forms.ModelForm

我的解决方案是也使用模板标签。我使用了包含标签

myapp/templatetags/model_helpers.py

from django import template
register = template.Library()


@register.inclusion_tag('myapp/model_table.html', takes_context=True)
def model_as_table(context, model_key=None, model_table_attrs_key=None):

    if model_key is None:
        model_key = 'object'

    if model_table_attrs_key is None:
        model_table_attrs_key = 'model_table_attrs'

    try:
        attrs = context[model_table_attrs_key]
    except KeyError:
        attrs = context[model_key]._meta.get_all_field_names()

    table_context = {'rows': []}
    for attr in attrs:
        try:
            value = str(getattr(context[model_key], attr))
            if value:
                table_context['rows'].append({'attr': attr,
                                              'value': context[model_key][attr]})
        except AttributeError:
            pass
        # Needs a way to display many_to_many fields.
        except StopIteration:
            pass

    return table_context

myapp/templates/myapp/model_table.html

{% for row in rows %}
    <tr>
        <td class="name">{{ row.attr }}</td>
        <td class="field">{{ row.value }}</td>
    </tr>
{% endfor %}

myapp/templates/myapp/outputtable.html

{% load model_helpers %}

<table>
    {% model_as_table %}
</table>

通过此实现,您可以传递要显示的模型属性以及显示顺序。

myapp/views.py

def output_table(request):
    output = My_Model()
    return render_to_response('outputtable.html',
                              {'output': output, 'model_table_attrs': ['attr1', 'attr2']})

我也喜欢这种完全分离的 html 和 python 代码。


1
投票

如果您只想输出一个特定模型,请将模板更改为类似的内容

<tr>
  <td>Name:</td>
  <td>{{ output.name}}</td>
</tr>

适用于您关心的所有领域。如果您希望能够对应用程序中的任意模型执行此操作,请查看此snippet。这将为您提供一个要循环的字段集合。


1
投票

天哪,这已经很旧了,但是通用视图似乎很适合这个问题,至少对我来说是这样。列表详细视图应该可以帮助我跑得更快。 :)


0
投票

模型实例 (

as_table
) 或查询集 (
MyModel()
) 上没有方法
MyModel.objects.all()
。您可能已经将
as_table
视为 表单方法
as_table
。你那里没有表格。

如果您想将模型实例/查询集打印为表格,则必须自己设计。


0
投票

我想出了一个适合我的特定需求的解决方案,它将任何简单模型的数据呈现到表行中。将以下过滤器添加到

templatetags/your_tags_file.py
(不要忘记templatetags文件夹中的_init_.py文件):

from django import template
from django.utils.html import escape

register = template.Library()

@register.filter()
def as_table(model):
    ret = ""
    for field in model._meta.get_fields():
        field_value = getattr(model, field.name)
        field_value_str = str(field_value) if field_value else ""
        ret += f"<tr><th>{escape(field.verbose_name)}</th><td>{escape(field_value_str)}</td></td>"
    return ret

现在在模板中您可以执行以下操作:

{% load your_tags_file %}
<table>
    {{output|as_table|safe}}
</table>

这将为您在一个简单的表格中呈现模型。您可以通过修改

thead
生成方式的逻辑,轻松添加任何您认为合适的所需
tbody
ret
逻辑。希望这对某人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.