Django - Простой список задач с галочками
У меня есть следующие модели django:
class Tasks(models.Model):
date_created = models.DateTimeField(auto_now_add=True)
date_changed = models.DateTimeField(auto_now=True, auto_now_add=False)
title = models.CharField(verbose_name=_('Title'), max_length=50)
content = HTMLField(verbose_name=_('Content'), max_length=8000)
class TasksStatus(models.Model):
date_created = models.DateTimeField(auto_now_add=True)
date_changed = models.DateTimeField(auto_now=True, auto_now_add=False)
task = models.ForeignKey(Tasks, on_delete=models.SET_NULL, null=True, related_name="task_status")
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="task_user_id", on_delete=models.CASCADE, verbose_name=_("User"))
checked = models.BooleanField(default=False, null=True, verbose_name=_("Checked"))
На шаблоне я хочу разместить все задачи, которые существуют, и дать пользователю возможность отметить каждую задачу. Это уже записано в базу данных ajax представлением:
class UpdateTaskStatus(LoginRequiredMixin, View):
def dispatch(self, request, *args, **kwargs):
return super(UpdateTaskStatus, self).dispatch(request, *args, **kwargs)
def post(self, request):
task_id = request.POST.get("task_id")
task_status = request.POST.get("task_status")
task = Tasks.objects.get(id=task_id)
if (task_status == "0"):
task_status = True
else:
task_status = None
object, created = TasksStatus.objects.get_or_create(user=request.user, task=task)
object.checked = task_status
object.save()
tasks = Tasks.objects.all()
tasks_completed = TasksStatus.objects.filter(user=request.user, checked=True).count()
if (tasks.count() != 0):
if (tasks_completed != 0):
tasks_completed = int(round((tasks_completed / tasks.count()) * 100, 0))
return JsonResponse({"task_id": task_id, "task_status": task_status,"tasks_completed": tasks_completed, "msg": "Task status updated."})
Представление, которое приходит в шаблон, следующее:
@login_required
def participation_dashboard(request):
user = request.user
if user.groups.filter(name='teacher').exists():
defaultTagGenerator(user)
dt = timezone.now()
all_data = request.GET.get('filter', None)
days_dict = {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 0}
appointments = Appointment.objects.filter(Q(user_id=user), Q(date__week_day__gte=days_dict[dt.weekday()]),
Q(date__time__gt=dt.time()), ~Q(classification=choices.FREE)).order_by(
'date__week_day', 'date__time')
if not all_data:
appointments = appointments[:2]
# Get tasks from database
tasks = Tasks.objects.all()
tasks_checked = Tasks.objects.filter(task_status__user=user)
tasks_completed = TasksStatus.objects.filter(user=user, checked=True).count()
if (tasks.count() != 0):
if (tasks_completed != 0):
tasks_completed = int(round((tasks_completed / tasks.count()) * 100, 0))
return render(request, 'participation_dashboard.html', {'appointments': appointments, 'dt': dt, 'tasks': tasks, 'tasks_checked': tasks_checked, 'tasks_completed': tasks_completed})
С чем у меня возникают трудности, так это с правильным отображением шаблона. Сам шаблон выглядит следующим образом:
{% for task in tasks %}
<div class="card kk-card dashboard_content_item kk-card-confirmed">
<div class="card-header d-flex" style="border-bottom: none !important;">
<div class="justify-content-start" style=" padding: 0px; margin: 0px; background-color: white; top: 0px; left: 0px; position: absolute;">
{% for task_checked in tasks_checked %}
{% if task.id == task_checked.id %}
{% if task_checked %}
<i task-status="1" task-id="{{ task.id }}" class="task far fa-check-square"></i>
{% endif %}
{% endif %}
<i task-status="0" task-id="{{ task.id }}" class="task far fa-square"></i>
{% endfor %}
</div>
<a style="padding-left: 25px; padding-top: 3px;" class="justify-content-start" data-toggle="collapse" href="#" data-target="#task_sub_content{{ forloop.counter0 }}">
{{ task.title }}
</a>
</div>
<div class="card-body collapse" id="task_sub_content{{ forloop.counter0 }}">
<p class="card-text">
{{ task.content | safe }}
</p>
</div>
</div>
{% endfor %}
Как я могу отобразить, отметил ли пользователь задачу. В моем понимании мне нужен связанный поиск по задачам, но с двумя внешними ключами user и task id, как это делается? Мой пример заканчивается так: