I\'m working on an attendance entry form for a band. My idea is to have a section of the form to enter event information for a performance or rehearsal. Here\'s the model
Here is how I solved the problem. There's a bit of a trade-off in creating and deleting the records, but the code is clean...
def manage_event(request, event_id):
"""
Add a boolean field 'record_saved' (default to False) to the Event model
Edit an existing Event record or, if the record does not exist:
- create and save a new Event record
- create and save Attendance records for each Member
Clean up any unsaved records each time you're using this view
"""
# delete any "unsaved" Event records (cascading into Attendance records)
Event.objects.filter(record_saved=False).delete()
try:
my_event = Event.objects.get(pk=int(event_id))
except Event.DoesNotExist:
# create a new Event record
my_event = Event.objects.create()
# create an Attendance object for each Member with the currect Event id
for m in Members.objects.get.all():
Attendance.objects.create(event_id=my_event.id, member_id=m.id)
AttendanceFormSet = inlineformset_factory(Event, Attendance,
can_delete=False,
extra=0,
form=AttendanceForm)
if request.method == "POST":
form = EventForm(request.POST, request.FILES, instance=my_event)
formset = AttendanceFormSet(request.POST, request.FILES,
instance=my_event)
if formset.is_valid() and form.is_valid():
# set record_saved to True before saving
e = form.save(commit=False)
e.record_saved=True
e.save()
formset.save()
return HttpResponseRedirect('/')
else:
form = EventForm(instance=my_event)
formset = OptieFormSet(instance=my_event)
return render_to_response("edit_event.html", {
"form":form,
"formset": formset,
},
context_instance=RequestContext(request))