2017-01-22 2 views
1

플라스크를 배우고 학생의 이름과 마크를 허용하고 모든 마크의 합계를 찾고 테이블에 표시하는 웹 앱을 만들려고했습니다. 그러나 합계는 항상 0으로 표시됩니다.플라스크를 사용하여 jinja2 템플릿에서 숫자의 합을 찾습니다.

from flask import Flask, render_template, request 

app = Flask (__name__) 

@app.route('/') 
def student(): 
     return render_template('student.html') 

@app.route('/result', methods = ['POST', 'GET']) 
def result(): 
     if request.method == 'POST': 
       result = request.form 
       return render_template('result.html', result = result) 

if __name__ == '__main__': 
     app.run(host = '0.0.0.0', debug = True) 

student.html :

 <form action = "/result" method = "POST"> 
       <p>Name <input type = "text" name = "Name" /></p> 
       <p>Physics <input type = "text" name = "Physics" /></p> 
       <p>Chemistry <input type = "text" name = "chemistry" /></p> 
       <p>Maths <input type ="text" name = "Mathematics" /></p> 
       <p><input type = "submit" value = "submit" /></p> 
     </form> 

</body> 
</html> 

result.html :

<html> 
     <head> 
       <title>Results</title> 
     </head> 

     <body> 
       <h1>{{result["Name"]}}'s results</h1> 
       {% set total = 0 %} 
       <table border = 1> 
       {% for key, val in result.iteritems() %} 
         {% if key != 'Name' %} 
           {% set total = total|int + val|int %} 
           <tr> 
             <td>{{ key }}</td> 
             <td>{{ val }}</td> 
             <td>{{ total }}</td> 
           </tr> 
         {% endif %} 
       {% endfor %} 
       <tr> 
         <td>Total</td> 
         <td>{{total}}</td> 
       </tr> 
       </table> 
     </body> 
</html> 

코드는

mark_total.py 이하 주어진다

<html> 
 
\t <head> 
 
\t \t <title>Results</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <h1>ABC's results</h1> 
 
\t \t <table border = 1> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>Mathematics</td> 
 
\t \t \t \t <td>100</td> 
 
\t \t \t \t <td>100</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>chemistry</td> 
 
\t \t \t \t <td>100</td> 
 
\t \t \t \t <td>100</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>Physics</td> 
 
\t \t \t \t <td>100</td> 
 
\t \t \t \t <td>100</td> 
 
\t \t \t </tr> 
 
\t \t \t <tr> 
 
\t \t \t \t <td>Total</td> 
 
\t \t \t \t <td>0</td> 
 
\t \t \t </tr> 
 
\t \t </table> 
 
\t </body> 
 
</html>

누군가가 나에게이 문제를 해결하는 방법을 이해하는 데 도움시겠습니까 다음과 같이

출력의 HTML 소스는?

+0

당신이 정말 템플릿의 계산을해야합니까를? 왜 이것을 'mark_total.py'에서 계산하고 결과를 템플릿에 전달합니까? –

+0

예. 파이썬에서 변경 작업을 시도했는데 효과가있었습니다. 나는 그것을 템플릿으로 시험해보고 싶었다. –

답변

2

문제는 루프 내부에 total이 정의되어 있지 않으며 루프 외부에서 정의되고 액세스되는 동일한 total이 아닌 것입니다. 이것이 로컬 범위입니다.

이와 같은 해킹을 사용하면이 문제를 극복 할 수 있습니다 (this 답변).

<html> 
     <head> 
       <title>Results</title> 
     </head> 

     <body> 
       <h1>{{result["Name"]}}'s results</h1> 
       {% set total = [0] %} 
       <table border = 1> 
       {% for key, val in result.iteritems() %} 
         {% if key != 'Name' %} 
           {% set _ = total.append(total.pop() + val|int) %} 
           <tr> 
             <td>{{ key }}</td> 
             <td>{{ val }}</td> 
             <td>{{ total[0] }}</td> 
           </tr> 
         {% endif %} 
       {% endfor %} 
       <tr> 
         <td>Total</td> 
         <td>{{ total[0] }}</td> 
       </tr> 
       </table> 
     </body> 
</html> 

하지만 템플릿에서 이러한 작업을 수행하는 것이 좋습니다. 템플릿의 주된 아이디어는 로직 (예 : 총계 계산)과 표현을 분리하는 것이며이 원칙을 위반하는 것입니다.

+0

질문에 답하는 것뿐만 아니라 올바른 접근법을 제안한 Ilya에게 감사드립니다. –

1

당신은 루프가 딕셔너리를 제외하고는 루프의 외부에 영향을주지 않는 내부 변수 값 변경 :

{% set total = {'value': 0} %} 
... 
    {% if total.update({"value": c|int + total.value|int }) %} {% endif %} 
... 
    {{total.value}} 
+1

dict뿐만 아니라. 사실, 모든 변경 가능한 객체가 작동합니다. –

관련 문제