Вы можете рассмотреть возможность использования функциональности ModelForm , и если вы заранее знаете, какие части модели появятся в конкретном отчете, единственный вопрос - это то, какой "вид" Model
вы хотите использовать?генерировать.Затем конечный пользователь может указать объекты экземпляра (из одной или нескольких моделей), в которых они заинтересованы, и порядок этих объектов.Затем вы строите окончательный отчет из этих компонентов.
Одним из недостатков Django (хотя кто-то, пожалуйста, исправьте меня, если я ошибаюсь по этому поводу) является то, что рендеринг объекта формы всегда находится в контексте редактируемой формы., хотя часто было бы очень хорошо иметь представление формы «только для чтения».Там, где это было проблемой для меня, я просто реализовал «рендерер» в самом классе Model
(это не очень похоже на Django-esque, но оно лучше соответствует моим представлениям о OOD и инкапсуляции).Как правило, я создаю as_row()
и as_rotable()
методы на моем Model
, которые самостоятельно визуализируются в HTML в формате «один экземпляр на строку» или «одно поле на строку и один экземпляр на таблицу».
Общие представления должно помочь с этим, но я не совсем понял, как сделать это плавно, поэтому на данный момент у меня осталось что-то вроде примера ниже.
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)