Как использовать обратные отношения в представлениях на основе классов в Django - 2
Я создаю список дел, в котором я хочу, чтобы задачи отображались в соответствующую дату, но мне трудно это сделать.
Я нашел еще один ресурс, который вроде как отвечает на похожий вопрос, но мне все еще трудно реализовать запрос с обратными отношениями, и я не совсем уверен, как поместить его в шаблон.
Провожу 2-3 дня, застряв на этом. Надеюсь, здесь я смогу получить несколько советов
Мои модели:
class Dailies(models.Model):
date = models.DateField(auto_now_add=True)
the_user = models.ForeignKey(
get_user_model(),
on_delete=models.CASCADE,
)
def __str__(self):
return str(self.date)
class DailyTask(models.Model):
task = models.CharField(max_length=255)
dailies = models.ForeignKey(
Dailies,
on_delete=models.CASCADE
)
def __str__(self):
return self.task
Мой ListView:
class DailiesListView(LoginRequiredMixin, ListView):
model = Dailies
template_name = 'home.html'
context_object_name = 'date'
ordering = ['-date']
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['date'] = context['date'].filter(the_user=self.request.user)
context['todos'] = DailyTask.objects.filter(
dailies__the_user=self.request.user)
return context
Мой шаблон (home.html):
{% if user.is_authenticated %}
{% for each_date in date %}
<h3>
<li>
{{each_date}}:
{% for todo in date.dailies_set.all %}
<br>
{{todo}}
{% endfor %}
</li>
</h3>
{% endfor %}
{% else %}
...
{% endif %}
В вашем шаблоне {% for todo in date.dailies_set.all %} вы получаете даты из date, который всегда извлекает все даты, но вы должны попытаться получить их из each_date, поэтому ваш код должен быть таким.
{% if user.is_authenticated %}
{% for each_date in date %}
<h3>
<li>
{{each_date}}:
{% for todo in each_date.dailies_set.all %}
<br>
{{todo}}
{% endfor %}
</li>
</h3>
{% endfor %}
{% else %}
...
{% endif %}
Используя {% for todo in each_date.dailytask_set.all %}, я смог правильно выполнить итерацию.
Что я сделал, так это использовал RelatedManager с помощью "_set", и это позволило мне проследить назад к dailytask и итерировать задачи, соответствующие их датам. И это дало мне желаемый результат.
Спасибо @mirodil за помощь!