2015-02-07 3 views
0

Я пытался читать текстовые файлы с Flask и Jinja, но, используя для циклов, у меня были проблемы. Мой код ниже:Jinja Error Return About For Loop

{% for fileNamesIterator in fileNames 
fileNameOpen = open(fileNamesIterator, "r") 
fileLines = fileName.readlines() %} 

<div id="{{ fileNamesIterator[:len(fileNamesIterator)-4] }}" class="title">Title: {{ fileLines[2] }}</div> 
<div class="author">Author: {{ fileLines[1] }}</div> 
<div class="date">Date Posted: {{ fileLines[0] }}</div> 
<br><br> 
<div class="mainText"> {{ fileLines[3] }} <br> {{ fileLines[4] }} 
</div> 
<hr> 

{% fileLines.close() 
endfor %} 

Единственная проблема заключается в том, что она возвращается сообщение об ошибке:

TemplateSyntaxError: Encountered unknown tag 'fileLines'. Jinja was looking for the following tags: 'endfor' or 'else'. The innermost block that needs to be closed is 'for'.

я обнаружил, что это вызывает проблему:

fileNameOpen = open(fileNamesIterator, "r")
fileLines = fileName.readlines()

Но не должен» t Я могу выполнять другие инструкции python после инструкции for, но перед оператором endfor?

Любые идеи?

Решение:Дзиндзя не Python и большинство работ должно быть сделано из шаблона

ответ

2

Дзиндзя является не Python (если вам нужно, чтобы иметь возможность написать произвольный Python в ваших шаблонах вам будет лучше с Mako). Вместо этого вам нужно, чтобы сделать работу в Python и передать результаты в Джиндже:

data = [] 
for file_name in file_names: 
    with open(file_name, 'r') as f: 
     file_lines = f.readlines() 
     data.append({ 
      "id": file_name[:len(file_name) - 4], 
      "title": file_lines[2], 
      "author": file_lines[1], 
      "date": file_lines[0], 
      "content": file_lines[3:5] 
     }) 

return render_template("template.html", articles=data) 

Тогда ваш шаблон может быть просто:

{% for article in articles %} 
<div id="{{ article.id }}" class="title">Title: {{ article.title }}</div> 
<div class="author">Author: {{ article.author }}</div> 
<div class="date">Date Posted: {{ article.date }}</div> 
<br><br> 
<div class="mainText"> {{ article.content[0] }} <br> {{ article.content[1] }} 
</div> 
<hr> 
{% endfor %}