Django работа с ManyToManyField

в данной ситуации не могу связать две модели Event и Profile. Нужно записать в третью таблицу идентификаторы Event и Profile связанного с User. При нажатии на кнопку связанная таблица не заполняется. Вот что получилось:

models.py

class Event(models.Model):
    id = models.AutoField(primary_key=True)
    date = models.DateField(max_length=150)


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    participant = models.ManyToManyField(Event)

forms.py

class EventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ('id', 'date',)


class ProfileParticipantForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('participant',)

Не могу догнать как правильно реализовать контроллер чтобы он записал данные в таблицу

views.py

def event_page(request, pk):
    event_item = Event.objects.get(pk=pk)

    if request.method == 'POST':
        profile_form = ProfileParticipantForm(request.POST)
        event_form = EventForm(request.POST)
        if profile_form.is_valid():
            p = profile_form.save()
            e = event_form.save()
            p.participant.add(e)

        return redirect('main')

    return render(request, 'event_page/event.html', {"event_item": event_item})

Ответы (2 шт):

Автор решения: Andrew Holovko

По порядку.

в данной ситуации не могу связать две модели Event и Profile. Нужно записать в третью таблицу идентификаторы Event и Profile связанного с User.

Создаёте таблицу, которая будет ссылаться на сущности, которые вы хотите записывать.

class Link(models.Model):
    event = models.OneToOneField(Event, on_delete=models.CASCADE)
    profile = models.OneToOneField(Profile, on_delete=models.CASCADE)

a = Link(event=Event, profile=Profile)  # Event, Profile - сущности, которые должны хранится в БД
a.save()

Вы должны сделать форму на основании этой модели.

class LinkForm(forms.ModelForm):
    class Meta:
        model = Link
        fields = ('event', 'profile')

В вашем методе event_page вы должны эту форму сохранить, конкретно ту форму, которую ранее передали на фронт.

def event_page(request, pk):
    event_item = Event.objects.get(pk=pk)
    if request.method == 'POST':
        form = LinkForm(request.POST)
        if form.is_valid():
            form.save()
        return redirect('main')

    return render(request, 'event_page/event.html', {"event_item": event_item})

Проверено, работает.

→ Ссылка
Автор решения: Captain Mountain

Проблема была решена следующим образом:

models.py

class Event(models.Model):
    id = models.AutoField(primary_key=True)
    date = models.DateField(max_length=150)
    participant = models.ManyToManyField(Event)

forms.py

class EventEntryForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ('participant',)

views.py

def event_page(request, pk):
    global event_item
    event_item = Event.objects.get(pk=pk)

    if request.method == 'POST':
        profile = Profile.objects.get(user_id=request.user.id)
        event_item.participant.add(profile)
        return redirect('main')

    return render(request, 'event_page/event.html', {"event_item": event_item})

Таким образом имеем промежуточную таблицу со значениями: введите сюда описание изображения

→ Ссылка