Как создавать пользовательские отчеты, используя django - PullRequest
1 голос
/ 01 марта 2011

У меня есть проект, которому нужно несколько отчетов. Проблема в том, что я не знаю, какими должны быть эти отчеты, и я хотел бы позволить пользователю создавать их на лету (а затем сохранять их). При рассмотрении вопроса о том, как это сделать, меня поразило то, что шаблоны пишутся с использованием точечной нотации, поэтому нет простого способа сказать

{% for field in fields %}
    <td>{{ object.field }}</td>
{% endfor %}

Итак, я придумал несколько идей, в основном, чтобы иметь генератор шаблонов, который просто отображает шаблон в строку и отображает страницу из этого.

from django.template import Template
t = Template(report_defintion.create())
t.render(context)

Другой метод заключается в использовании шаблона-тега, который берет список полей и отображает каждую «строку» в отчете таким образом.

{% render_row object fields %}

Это две лучшие идеи, которые я выдвинул до сих пор. Есть лучший способ сделать это? Есть ли приложение django, которое уже делает это?

1 Ответ

0 голосов
/ 16 марта 2011

Вы можете рассмотреть возможность использования функциональности 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...