This code succeeds in creating and saving an Event object and its related Participant objects, but the newly-created Participant objects overwrite ones already in the db:
Models:
# A membership 'roster' (i.e. a group of potential players)
class Roster(models.Model):
name = models.CharField(max_length=50, null=False, blank=False, help_text="Roster name")
slug = models.CharField(max_length=50, null=False, blank=False, help_text="Used in URLs")
location = models.CharField(max_length=50, null=False, blank=False, default="", help_text="The default location")
comment = models.CharField(max_length=400, null=True, blank=True, help_text="A comment about the group")
# A specific event with its participants
class Event(models.Model):
date_time = models.CharField(max_length=50, null=False, blank=False)
location = models.CharField(max_length=50, null=False, blank=False)
roster = models.ForeignKey(Roster, related_name='events', on_delete=models.CASCADE, default=None, null=True, help_text="The event's roster")
comment = models.CharField(max_length=400, null=True, blank=True)
# A participant in a specific event.
class Participant(models.Model):
member = models.OneToOneField(Member, on_delete=models.CASCADE,primary_key=True,) #null=False?
event = models.ForeignKey(Event, on_delete=models.CASCADE, null=False, related_name="participants")
status = models.CharField(max_length=50, choices=StatusChoices, default="Unknown")
status = models.CharField(max_length=50, choices=StatusChoices, default="Unknown")
phone = models.CharField(max_length=15, default=None, blank=True, null=True)
comment = models.CharField(max_length=400, blank=True, null=True)
Form:
class EventForm(forms.ModelForm):
location = forms.CharField(required=True, widget=forms.TextInput(attrs={'class': 'border-input'}))
date_time = forms.CharField(required=True, widget=forms.TextInput(attrs={'class': 'border-input'}))
comment = forms.CharField(required=False, widget=forms.Textarea(attrs={'class': 'border-input'}))
class Meta:
model = Event
fields = ['location', 'date_time', 'comment']
View:
Create an event and its participants (which are generated from existing members
def event_add(request, roster_id):
roster = get_object_or_404(Roster, pk=roster_id)
if request.method == 'GET':
form=EventForm(initial={"location": roster.location})
return render(request, 'event_edit.html',{ 'form': form, 'roster': roster})
else:
form = EventForm(request.POST)
if form.is_valid():
event = form.save()
event.roster = roster # not user-entered
event.save()
# Add participants
for member in roster.members.all():
participant = Participant(member=member, event=event, status="available",comment=member.comment)
participant.save()
else:
print("ERROR: ", form.errors)
return redirect("event", roster.slug, event.id)