Как мне передать данные из 2 наборов данных в представление Django?

У меня есть простой проект на Django, который состоит из 3 наборов данных: Members --& lt; mem_ev- Events, так что любой участник может посещать любое количество событий и у любого события может быть много участников (т.е. классическое отношение "многие ко многим"). У меня работают шаблоны "участники", "события", "участники на событие" и "события на участника", но я хочу передать подсчет количества событий на одного участника в основной список участников (list.html).

Учитывая следующие файловые структуры, как мне записать event_count на Member и как мне передать это в соответствующий шаблон (list.html)?

Мой app:urls.py файл:

app_name = 'wf'

urlpatterns = [ path('',views.members_list,name='member-list'),
                path('home/',views.members_list,name='member-list'),
                path('events/',views.events_list,name='event-list'),
                path('about/',views.about,name='wf-about'),
                path('event_detail/<int:id>/',views.event_detail,name='event_detail'),
                path('list_event_members/<int:id>/', views.list_event_members, name='list_event_members'),
                path('list_member_events/<int:id>/', views.list_member_events, name='list_member_events'),
                ]

Мой views.py файл:

def members_list(request):
    members = Member.objects.all()
    event_count = ?? What goes here ??      <------
    return render(request,'wf/list.html',{'members':members},{'event_count':event_count})

def events_list(request):
    events = Event.objects.all()
    return render(request,'wf/events.html',{'events':events})

def event_detail(request,id):
    event = Event.objects.get(id=id)
    return render(request,'wf/event_detail.html',{'event':event})

def about(request):
    return render(request,'wf/about.html')

def list_event_members(request,id):
    event_members = Member.objects.filter(mem_ev__event_id=id)
    return render(request,'wf/list_event_members.html',{'event_members':event_members})

def list_member_events(request,id):
    member_events = Event.objects.filter(mem_ev__member_id=id)
    return render(request,'wf/list_member_events.html',{'member_events':member_events})

и соответствующий файл шаблона (list.html) выглядит следующим образом:

{% extends "wf/base.html" %}
{% block content %}
  <h2>Members</h2>
    <table width="100%" cellpadding=8 style="border:1px solid black;">
      <thead class="table-success">
        <tr style="border:1px solid black;">
          <th scope="col"><h4>Member</h4></th>
          <th scope="col"><h4>Email</h4></th>
          <th scope="col"><h4>Events Attending</h4></th>
        </tr>
      </thead>
      <tbody>
      {% for member in members %}
        <tr {% if forloop.counter|divisibleby:2 %} style="background-color:gainsboro;"{% endif %}>
          <td><a  class="fw-bolder" href="{%  url 'wf:list_member_events' member.id %}">{{ member.lname }}, {{ member.fname }}</a></td>
          <td>{{ ?? What goes here ?? }}</td>    <-------------
          <td></td>
       </tr>
      {% endfor %}
      </tbody>
    </table>
{% endblock %}

Укажите свой скриншот model.py также тогда мы сможем составить запрос

Я понял, что нужно делать.

  1. Добавьте поле event_count в модель Member в Models.py (не забыв сделать makemigrations/migrate!)

  2. Пройдитесь по каждому members = Member.objects.all() в views.py, изменяя поле Member.event_count с обновленным количеством.

Вот мой измененный код для members_list в views.py

def members_list(request):
    members = Member.objects.all()
    for x in members:
        x.event_count = mem_ev.objects.filter(member_id=x.id).count()
    return render(request,'wf/list.html',{'members':members})
Вернуться на верх