输出Django模型作为表

时间:2010-02-17 19:07:54

标签: django html-table models

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

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中看到的内容。

6 个答案:

答案 0 :(得分: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()

现在你已经准备好了。所以诀窍是从原始模型继承你的Form。

答案 1 :(得分:1)

models.Model课程没有类似as_table()课程的方法forms.ModelForm

我的解决方案是使用模板标签。我选择了inclusion tag

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代码。

答案 2 :(得分:0)

模型实例(as_table)或Querysets(MyModel())上没有方法MyModel.objects.all()。您可能已将as_table视为the forms method as_table。你那里没有表格。

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

答案 3 :(得分:0)

如果您只想输出一个特定型号,请将模板更改为

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

您所关注的所有字段。如果您希望能够为应用中的任意模型执行此操作,请查看此snippet。这将为您提供一个字段集合来循环。

答案 4 :(得分:0)

OMG这个已经老了,但Generic Views似乎非常适合这个问题,至少对我来说。列表详细信息视图应该可以帮助我更快地运行。 :)

答案 5 :(得分:0)

我提出了一个解决方案,该解决方案适用于我的特定需求,可将任何简单模型的数据呈现到表行中。将以下过滤器添加到templatetags/your_tags_file.py(不要忘记templatetags文件夹中的__init__.py文件):

from django import template
register = template.Library()

@register.filter()
def as_table(model):
    ret = ""
    for name in model._meta.get_all_field_names():
        try:
            field = str(getattr(model, name))
            if field:
                ret += '<tr><td class="name">'+name+'</td><td class="field">'+field+'</td></td>'
        except AttributeError:
            pass
    return ret

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

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

这将为您呈现一个简单的表格中的模型。您可以通过修改thead生成方式的逻辑,轻松添加任意所需的tbodyret逻辑。希望这有助于某人。