Django display crossed tables
I have an event signup page where the participant insert's details upon signing up. Then in a view I am trying to display a listing of their name, title, and details. I am stuck trying to get the details field to display if there were any for the participant. Thank you.
######## 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 %}
In your code how you are passing context doesn't makes sense specially 'events':Event.objects.filter(Event_ID=pk), 'event':event
Django ORM get() method will always expect to give you 1 results if there are more than 1 results it will give an error. So not sure what is your idea here for events and event. If you expect more than 1 value with same event id then use filter() otherwise use get()
Try it like this:
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)
In your template file adjust like below:
{% 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 %}