Django 显示交叉表

问题描述 投票:0回答:1

我有一个活动注册页面,参与者可以在注册时插入详细信息。然后在视图中我尝试显示他们的姓名、标题和详细信息的列表。我一直试图让详细信息字段显示(如果有参与者的话)。谢谢你。

######## 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 %}
django django-models django-templates
1个回答
0
投票

在您的代码中,传递上下文的方式没有特别意义

'events':Event.objects.filter(Event_ID=pk), 'event':event

Django ORM

get()
方法总是期望给你 1 个结果,如果结果超过 1 个,则会出错。所以不确定你对这里的活动和活动有什么想法。如果您期望具有相同事件 id 的值超过 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 %}
© www.soinside.com 2019 - 2024. All rights reserved.