2011-03-01 6 views
1

여러 보고서가 필요한 프로젝트가 있습니다. 문제는, 그 보고서가 무엇인지 알고 싶지 않다. 사용자가 즉시 보고서를 작성한 다음 저장하도록한다. 이 작업을 수행하는 방법을 통해가는, 정강이 나를 때리는 유지하는 것은, 템플릿 그래서, 몇 가지 아이디어를 생각했습니다django를 사용하여 사용자 정의 보고서를 작성하는 방법

{% 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 %} 

이들은 내가 지금까지 생각 해낸 두 가지 최고의 아이디어입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까? 이미 장고가있는 앱이 있습니까?

답변

0

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) 
관련 문제