Django отображает каждую модель, принадлежащую пользователю
У меня есть HTML файл шаблона и в этом файле находится сам билет (модель Ticket) и мне нужно отобразить сообщения, которые принадлежат каждому билету (модель TicketMessages).
Как я могу сделать следующее: -показать мне все TicketMessages (сообщения), которые принадлежат данному конкретному билету. Мне нужно получить текущий билет, а затем отобразить все пользовательские сообщения этого билета?
Файл моделей
class Ticket(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
default=None,
null=True,
on_delete=models.CASCADE,
)
title = models.CharField(max_length=200)
description = models.TextField()
......
def __str__(self):
return str(self.id)
class TicketMessages(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
default=None,
null=True,
on_delete=models.CASCADE,
)
ticket = models.ForeignKey(
Ticket,
default=None,
null=True,
on_delete=models.CASCADE,
)
admin_message = models.CharField(max_length=200, blank=True)
user_message = models.CharField(max_length=200, blank=True)
Файл представлений уже дает мне ID текущего билета
def ticket_system_view(request, id):
obj = Ticket.objects.get(id=id)
if request.method == 'POST':
user_form = TicketMessagesForm(
request.POST, instance=TicketMessages(ticket=obj, user=request.user))
if user_form.is_valid():
form_save = user_form.save(commit=False)
form_save.ticket = obj
form_save.save()
else:
user_form = TicketMessagesForm()
return render(request, 'ticket-system.html', {'obj': obj, 'user_form': user_form, })
Моя попытка выглядит следующим образом в шаблоне
{% for i in request.user.ticketmessages_set.all %}
<div>
{% if ... %} {{ i.user_message }} {% endif %}
</div>
<br />
{% endfor %}
Цикл ничего не отобразил, а во-вторых, я получил бы все сообщения о билетах пользователя, а не то, которое относится к конкретному билету. И да, я должен использовать get_object_or_404, но сначала о главном
С помощью related_name вы можете легко осуществлять обратную связь с объектами ForeignKey. Добавьте его к вашему models.py:
class Ticket(models.Model):
user = models.ForeignKey(
...
related_name='tickets'
)
class TicketMessages(models.Model):
user = models.ForeignKey(
...
related_name='messages'
)
Затем в шаблоне вы можете обратиться к набору запросов:
{% for i in request.user.messages.all %}
...
or
{% for i in request.user.tickets.all %}
...
В files.py вы можете получить набор queryset, который вы можете в дальнейшем обрабатывать как любой другой объект QuerySet. Например:
SomeUser.messages.filter(user_message__starts_with='Alert!')