所以我是ModelForms和{{form.as_table}}模板标记的狂热用户。这让我有一个通用的表单模板,我可以在不知道我的特定字段的情况下重用它。现在我想打印出与模板完全相同的模型,但没有表单字段。我从来没有遇到过这样做的好方法。谁知道一个?
这是一个更具体的例子:
model:
class ExampleModel(models.Model):
info1 = models.TextField()
info2 = models.TextField()
form:
class ExampleForm(forms.ModelForm):
class Meta:
model = ExampleModel
view:
def example_form_view(request):
form = ExampleForm()
return render_to_response('form.html', locals(), context_instance=RequestContext(request))
def example_display_view(request):
model = ExampleModel.objects.get(id=1)
return render_to_response('model.html', locals(), context_instance=RequestContext(request))
要打印表单,我有一个模板:
<form action="." method="post">
{% csrf_token %}
<table>
{{ form.as_table }}
<tr>
<td></td>
<td><input type='submit' value="submit" /></td>
</tr>
</table>
</form>
我还希望能够拥有一个包含以下内容的通用模板:
<table>
{{ model.as_table }}
</table>
并获得与表单一样的布局,但没有表单。有人知道有什么办法吗?
如果之前有人问过我,我很抱歉,但是我做了搜索并没有找到任何结果。虽然我不知道该搜索什么。
答案 0 :(得分:2)
您可以在模型上定义as_table
方法(如果要在多个模型中重复使用,则可以定义超类),例如:
def as_table(self):
output = '<table>'
# for each field in model
for field in self._meta.fields:
# optionally skip any unwanted fields such as primary keys, etc
# if field.auto_created:
# continue
output += '<tr><th>%s</th><td>%s</td></tr>' % (
field.name, getattr(self, field.name))
output += '</table>'
return output
答案 1 :(得分:0)
我在可插拔应用中实现了这样的只读“表单”:
DisplayText字段小部件:
https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/widgets.py
DisplayModelMetaclass使表单字段默认使用DisplayText小部件:
https://github.com/Dmitri-Sintsov/django-jinja-knockout/blob/master/django_jinja_knockout/views.py
以下是文档:
https://django-jinja-knockout.readthedocs.org/en/latest/forms.html#displaying-read-only-forms
它使用Jinja2宏在Bootstrap 3表中呈现这样的表单,但是widget和元类本身也可以与Django模板语言一起使用。