Django显示通用模型(类似于表单)

时间:2011-02-25 20:40:47

标签: django django-models django-forms

所以我是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>

并获得与表单一样的布局,但没有表单。有人知道有什么办法吗?

如果之前有人问过我,我很抱歉,但是我做了搜索并没有找到任何结果。虽然我不知道该搜索什么。

2 个答案:

答案 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模板语言一起使用。