Pre-populate an inline FormSet?

后端 未结 10 1537
自闭症患者
自闭症患者 2020-11-30 18:25

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

10条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-11-30 19:07

    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))
    

提交回复
热议问题