我有一个视图定义(尝试)将模型输出为表格。这是我到目前为止所拥有的:
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 中看到的内容。
所以你需要做的是以下几点:
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()
现在一切都准备好了。因此,诀窍是从原始模型继承您的表单。
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 代码。
如果您只想输出一个特定模型,请将模板更改为类似的内容
<tr>
<td>Name:</td>
<td>{{ output.name}}</td>
</tr>
适用于您关心的所有领域。如果您希望能够对应用程序中的任意模型执行此操作,请查看此snippet。这将为您提供一个要循环的字段集合。
天哪,这已经很旧了,但是通用视图似乎很适合这个问题,至少对我来说是这样。列表详细视图应该可以帮助我跑得更快。 :)
模型实例 (
as_table
) 或查询集 (MyModel()
) 上没有方法 MyModel.objects.all()
。您可能已经将 as_table
视为 表单方法 as_table
。你那里没有表格。
如果您想将模型实例/查询集打印为表格,则必须自己设计。
我想出了一个适合我的特定需求的解决方案,它将任何简单模型的数据呈现到表行中。将以下过滤器添加到
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
逻辑。希望这对某人有帮助。