Как мне передать данные из 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 также тогда мы сможем составить запрос
Я понял, что нужно делать.
Добавьте поле
event_count
в модельMember
вModels.py
(не забыв сделатьmakemigrations/migrate
!)Пройдитесь по каждому
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})