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 %}