ModelForm 기능을 활용할 수 있으며 특정 보고서에 모델의 어떤 부분이 나타날지 미리 알 수있는 경우 유일한 질문은 생성하려는 Model
의 "보기"입니다. 그런 다음 최종 사용자는 관심이있는 인스턴스 객체 (하나 이상의 모델에서)와 해당 객체의 순서를 지정할 수 있습니다. 그런 다음 이러한 구성 요소에서 최종 보고서를 작성합니다.
Django의 단점 중 하나는 (비록 내가 틀렸다면 누군가 제발 저를 고치겠습니다.) 양식 객체 렌더링은 항상 편집 가능한 양식의 컨텍스트에 있습니다. 양식의 "읽기 전용"보기. 이것이 나에게 문제가 되었다면 나는 단순히 Model
클래스에 "렌더러"를 구현했다. (이것은 장고하지는 않지만 OOD와 캡슐화에 대한 내 아이디어에 더 잘 부합한다.) 일반적으로 나는 에서 as_row()
과 as_rotable()
메서드를 만들고, "행당 한 인스턴스"또는 "행당 한 필드와 테이블 당 한 인스턴스"형식으로 HTML에 자체 렌더링합니다.
Generic Views이 작업에 도움이되지만이 작업을 원활하게 수행하는 방법을 알지 못했기 때문에 잠시 후 아래 예와 같이 남겨 두었습니다.
url.py :
from gridportal.wsmr.views import list, create, view, edit, copy, delete, reset
...
url(r'task/(?P<id>\d+)/?$', view, {'tmpl': 'wsmr/wsmrtask_detail.html'}, name="task_view"),
...
views.py :
from gridportal.wsmr.forms import WSMRTaskViewForm
...
def view(request, id, tmpl):
task = get_object_or_404(WSMRTask, pk=id)
form = WSMRTaskViewForm(instance=task)
return render_to_response(tmpl, {'object': form,}, context_instance=RequestContext(request))
forms.py :
class WSMRTaskViewForm(ModelForm):
class Meta:
model = WSMRTask
wsmr/wsmrtask_detail.html :
{% extends "base.html" %}
{% block content %}
<table>
{{ object.instance.as_rotable|safe }}
</table>
{% endblock %}
,
models.py :
class WSMRTask(GridTask):
...
def as_row(self):
return GridTask.as_row(self) + """
<td> <a href=%s/%s>%s</a> </td>
<td> %s </td>
<td> %s </td>
""" % (self.task_url, basename(self.mtz.name), basename(self.mtz.name), self.resolution, self.solvent)
def as_rotable(self):
return GridTask.as_rotable(self) + """
<tr><td>MTZ</td><td> <a href=%s/%s>%s</a> </td></tr>
<tr><td>resolution (A) </td><td> %s </td></tr>
<tr><td>solvent</td><td> %s </td></tr>
""" % (self.task_url, basename(self.mtz.name), basename(self.mtz.name), self.resolution, self.solvent)