초보자 : Django : 템플릿에 전달하기 전에 쿼리 세트에 계산 된 결과 추가
-
18-09-2019 - |
문제
Django와의 새로운 인생의 두 번째 날, 내 질문의 단순성을 실례합니다.
기존 DB 테이블 (읽기 전용 액세스)이있어 URL, 뷰, 모델 및 모든 좋은 것들을 사용하여 웹 페이지의 내용을 성공적으로 표시했습니다.
내가 가진 도전은 테이블에 표시해야 할 모든 정보가 포함되어 있지 않다는 것입니다. 이 표에는 열, 샘플 타임, 샘플 value, Sampleresult가있는 테스트 결과가 포함되어 있습니다. 그 열에서 계산 한 내용에 따라 다른 데이터를 표시해야합니다.
내 최종 목표는이 정보를 사용하여 시계열 그래프로 표시하는 것입니다. flotr. 지금은 웹 페이지의 테이블에 필요한 데이터를 덤프하게되어 기쁩니다. (결과 데이터를 시각화 할 수 있습니다)
ID가 템플릿으로 전달하는 것이 무엇인지,
- jssampletime (샘플 타임 DateTime 객체는 JavaScript epoch MS로 변환)
- resultValue (샘플러가 좋았는지 나쁜지 여부를 기반으로 한 샘플 value의 롤링 합계+-)
DEF 함수를 사용하여 jssampletime을 만들고 resultValue를 작성하는 것이 좋습니다. 나는이 함수를 Views.py에 추가 할 것이라고 가정합니다
views.py의 쿼리 세트를 반복하고 템플릿으로 전달하는 사전 목록에 결과를 저장 해야하는 것은 무엇인지 생각합니다. 이와 같은 것 (코드가 테스트되지 않음).
views.py
# views.py
# Sudo code to assit in asking the question
from django.shortcuts import render_to_response
from thing.reporter.models import Samples
def _datetime_to_js(sampletime):
#.. date conversion epoch magic
return jsd_result
def _rolling_sum(samplevalue,sampleresult):
#.. summing magic
return sum_result
def dumptable(request): # The def that is called by urls.py
object_list = Samples.objects.all()
list_for_template = []
for row in object_list:
jssampletime = _datetime_to_js(row.sampletime)
resultvalue = _rolling_sum(row.samplevalue,row.sampleresult)
list_for_template.append({'jssampletime':jssampletime,'resultvalue':resultvalue})
return render_to_response('tabledump.html', {'result_list': list_for_template})
탭식 .html
# tabledump.html template
{% block content %}
<h2>Results dumped to page for testing</h2>
<ul>
<table>
{% for result in result_list %}
<tr>
<td>{{ result.jssampletime }}</td>
<td>{{ result.resultvalue }}</td>
</tr>
{% endfor %}
</table>
</ul>
{% endblock %}
나는 이것이 효과가 있다고 생각하지만 그것이 Django MVC 방식인지 확실하지 않습니다.
내가 옳은가?
- QuerySet 결과를 상호 작용하여 Views.py에서 필요한 결과를 계산합니까?
- 내 결과를 템플릿으로 전달하여 DITT 목록 (그 이상의 쿼리 세트입니까)?
방향과 코드 팁을 찾고있는 것 같아요. 내가 올바른 길을 가고 있습니까? 더 좋은 방법이 있습니까?
해결책
표시중인 정보가 모델에있는 경우 모델에 속성/메소드를 추가하여 정보를 얻는 데 필요한 정보를 표시하지 않겠습니까? 그런 다음 실제 모델 목록 / 쿼리를 템플릿으로 전달하고 메소드를 속성으로 호출 할 수 있습니다.
예를 들어
class MyModel(models.Model):
model_field = models.CharField(max_length=255)
@property
def calculated_field(self):
return self._do_calculation(self.model_field)
루프의 상태 변수에 대한 액세스가 필요한 경우, 속성을 Python 객체에 첨부 할 수 있다는 것을 잊지 마십시오. 이것은 매우 유용 할 수 있습니다. 그래서 당신의 견해로는 다음과 같은 것을 가질 수 있습니다.
for row in object_list:
# update some variable we want to use in the template
row.newly_added_field = run_calculation(row, somevariable)
그런 다음이 두 가지 모두 템플릿 내에서 액세스 할 수 있습니다.
{% for result in result_list %}
<tr>
<!-- some stuff that displays the model directly -->
<td>{{ result.calculated_field}}</td>
<td>{{ result.newly_added_field}}</td>
</tr>
{% endfor %}