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 шт):
По порядку.
в данной ситуации не могу связать две модели 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})
Проверено, работает.
Проблема была решена следующим образом:
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})
