我有一个视图定义(尝试)将模型输出为表格。这就是我到目前为止所做的:
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中看到的内容。
答案 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
生成方式的逻辑,轻松添加任意所需的tbody
和ret
逻辑。希望这有助于某人。