Не удалось разобрать остаток: '()' из 'topic_files.items()'
Я работаю над проектом Django, в котором мне нужно отображать файлы, сгруппированные по темам для конкретной подачи. Каждое представление связано с несколькими темами, и каждая тема может содержать несколько файлов. Я столкнулся с проблемой при попытке отобразить это в шаблоне.
Модели:
from django.db import models
from users.models import UserProfile
# Create your models here.
class ResearchWork(models.Model):
name = models.CharField(max_length=100)
description = models.TextField()
def __str__(self):
return self.name
class Topic(models.Model):
research_work = models.ForeignKey(ResearchWork, related_name='topics', on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=100)
def __str__(self):
if self.research_work is None:
return f"Unassigned - {self.name}"
return f"{self.research_work.name} - {self.name}"
class Assignment(models.Model):
student = models.ForeignKey(UserProfile, related_name='student_assignment', on_delete=models.CASCADE)
teacher = models.ForeignKey(UserProfile, related_name='teacher_assignment', on_delete=models.CASCADE)
is_accepted = models.BooleanField(default=False) # charfield
is_reviewed = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
text = models.TextField(blank=True)
def __str__(self):
return f"Assignment for {self.student.user.username} with {self.teacher.user.username}"
class Submission(models.Model):
assignment = models.ForeignKey(Assignment, on_delete=models.CASCADE)
SEMESTER_CHOICES = (
('1', 'Semester 1'),
('2', 'Semester 2'),
('3', 'Semester 3'),
('4', 'Semester 4'),
('5', 'Semester 5'),
('6', 'Semester 6'),
('7', 'Semester 7'),
('8', 'Semester 8'),
)
semester = models.CharField(max_length=100, null=True, choices=SEMESTER_CHOICES)
research_work = models.ForeignKey(ResearchWork, on_delete=models.CASCADE, null=True)
created_at = models.DateTimeField(auto_now_add=True, null=True)
def __str__(self):
research_work_name = "No Research Work Assigned" if self.research_work is None else self.research_work.name
return f"{research_work_name} - for student {self.assignment.student.user.username} in semester - {self.semester}"
class File(models.Model):
topic = models.ForeignKey(Topic, related_name='files', on_delete=models.CASCADE, null=True)
submission = models.ForeignKey(Submission, related_name='files', on_delete=models.CASCADE, null=True)
filename = models.FileField(upload_to='submissions/', null=True)
upload_date = models.DateTimeField(auto_now_add=True)
is_accepted = models.BooleanField(default=False)
is_reviewed = models.BooleanField(default=False)
comment = models.TextField(null=True, blank=True)
def __str__(self):
return f"File: {self.filename.name} for Topic: {self.topic.name}"
Функция просмотра:
def admin_submission_details(request, sub_id):
if request.user.is_authenticated:
submission = get_object_or_404(Submission, pk=sub_id)
topics = Topic.objects.filter(research_work=submission.research_work)
topic_files = {topic: File.objects.filter(topic=topic, submission=submission) for topic in topics}
context = {'submission':submission, 'topics':topics, 'topic_files':topic_files}
return render(request, 'users/admin_submission_details.html', context=context)
else:
messages.error(request, 'Invalid user')
return redirect('login')
Шаблон:
{% block content %}
<div class="body flex-grow-1 px-3">
<div class="container-lg">
{% for topic, files in topic_files.items() %}
<div class="card mb-4">
<div class="card-header">
<strong>{{topic.name}}</strong>
</div>
<div class="card-body">
<div class="example">
<div class="table table-responsive">
<table class="table align-middle">
<thead>
<tr>
<td style="width: 20%" scope="col">Файл</td>
<td style="width: 20%" scope="col">Дата</td>
<td style="width: 20%" scope="col">Статус проверки</td>
<td style="width: 20%" scope="col">Комментарий</td>
</tr>
</thead>
<tbody>
{% for file in files %}
<tr>
<td>
<a href="{{file.filename.url}}" target="_blank"
>{{ file.filename}}</a
>
</td>
<td>{{ file.upload_date|date:"Y-m-d H:i"}}</td>
{% if file.is_reviewed %} {% if file.is_accepted %}
<td style="color: green">Принято</td>
{% else %}
<td style="color: red">Не принято</td>
{% endif %} {% else %}
<td style="color: orange">На проверке</td>
{% endif %}
<td>{{file.comment}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% if not topic_files[topic] %}
<div class="alert alert-warning" role="alert">
No files uploaded for this topic yet.
</div>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
const clickableRows = document.querySelectorAll(".clickable-row");
clickableRows.forEach((row) => {
row.addEventListener("click", function () {
window.location.href = this.getAttribute("data-href");
});
});
});
</script>
{% endblock content %}
Когда я пытаюсь отобразить этот шаблон, я сталкиваюсь со следующей ошибкой:
django.template.exceptions.TemplateSyntaxError: Could not parse the remainder: '()' from 'topic_files.items()'
Как правильно отобразить файлы, сгруппированные по темам, в шаблоне Django? Я пробовал разные подходы и каждый раз получаю одну и ту же ошибку. Любая помощь или предложения будут очень признательны!
В шаблонах Django вы не вызываете функции. Если элемент является вызываемым, шаблон вызовет его, без параметров, так:
{% for topic, files in topic_files.items %}
<!-- … -->
{% endfor %}