Django отображение скрещенных таблиц

У меня есть страница регистрации события, где участник вставляет свои данные при регистрации. Затем в представлении я пытаюсь отобразить список их имен, названий и подробностей. Я застрял, пытаясь заставить поле подробностей отображаться, если они есть для участника. Спасибо.

######## Model - Events ########
class Event(models.Model):
    Event_ID = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
    Event_Description = RichTextField(null=True, blank=True)
    Event_Category = models.ForeignKey(EventCategories, default=1, on_delete=models.CASCADE)
    Event_participants = models.ManyToManyField(User, blank=True, related_name='events')

    def __str__(self):
        return self.Event_Name


######## Model - Events ########
class Submission(models.Model):
    participant = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="submissions")
    event = models.ForeignKey(Event, on_delete=models.SET_NULL, null=True)
    details = models.TextField(null=True, blank=False)
    id = models.UUIDField(default=uuid.uuid4, unique=True,primary_key=True, editable=False)

    def __str__(self):
        return str(self.event) + ' --- ' + str(self.participant)


######## View ########
def single_event(request, pk):
    try:
        event = Event.objects.get(Event_ID=pk)
        submitted = Submission.objects.filter(event=event)
        submitted = list(submitted.values('participant','details'))
    except:
        return render(request, 'events/single-event.html', {"success":True,}, status=200)
    context = {'events':Event.objects.filter(Event_ID=pk), 'event':event, 'submitted':submitted}
    return render(request, 'events/single-event.html', context)


######## Template - single-event.html  ########
{% for event in events %}
    {% for user in event.Event_participants.all %}
    <tr>
        <td>{{ user.profile.title }}</td>
        <td>{{ user.first_name }} {{ user.last_name }}</td>
        <td>{{ ??????????? }}</td>  #This is where i need help. I would like to display 'details' from the Submission model here
    </tr>
    {% endfor %}
{% endfor %}

В вашем коде то, как вы передаете контекст, не имеет смысла, специально 'events':Event.objects.filter(Event_ID=pk), 'event':event

Django ORM get() метод всегда будет ожидать, что выдаст вам 1 результат, если результатов больше 1, то он выдаст ошибку. Поэтому не совсем понятно, что вы имеете в виду под событиями и событиями. Если вы ожидаете более 1 значения с одним и тем же идентификатором события, то используйте filter(), в противном случае используйте get()

Попробуйте так:

def single_event(request, pk):
    try:
        event = Event.objects.get(Event_ID=pk) #Should get only 1 results according to your model
        submissions = Submission.objects.filter(event=event).select_related('participant')
        
        submitted_details = {submission.participant.id: submission.details for submission in submissions}
        
    except Event.DoesNotExist:
        # When the event does not exist
        return render(request, 'events/single-event.html', {"success": False}, status=404)

    context = {
        'event': event,
        'submitted_details': submitted_details,
    }
    return render(request, 'events/single-event.html', context)

В вашем файле шаблона сделайте следующее:

{% for user in event.Event_participants.all %}
<tr>
    <td>{{ user.profile.title }}</td>
    <td>{{ user.first_name }} {{ user.last_name }}</td>
    <td>{{ submitted_details|default:user.id:"No details submitted." }}</td>
</tr>
{% endfor %}
Вернуться на верх