#15574: IndexError: list index out of range caused by inline formsets
-------------------------------------+-------------------------------------
     Reporter:  poswald              |                    Owner:  nobody
         Type:  Bug                  |                   Status:  new
    Component:  Forms                |                  Version:  master
     Severity:  Normal               |               Resolution:
     Keywords:  inline formset       |             Triage Stage:  Design
    Has patch:  0                    |  decision needed
  Needs tests:  0                    |      Needs documentation:  0
Easy pickings:  0                    |  Patch needs improvement:  0
                                     |                    UI/UX:  0
-------------------------------------+-------------------------------------
Changes (by dangtrinhnt@…):

 * has_patch:  1 => 0


Comment:

 Hi everyone,

 I got the same problem with Django 1.1. But, the real problem is my app'd
 worked well before I added 3 foreignkey field to the model. My code as
 follow:

 '''models.py''':


 {{{
 class PtcEvent(models.Model):
         name = models.CharField(max_length=50)
         desc = models.TextField(verbose_name='description')
         grades = models.ManyToManyField(Grade)
         view_start = models.DateTimeField(default=NOW)
         view_end = models.DateTimeField(default=NOW + timedelta(days=30))
         edit_start = models.DateTimeField(default=NOW)
         edit_end = models.DateTimeField(default=NOW + timedelta(days=25))

         active = models.BooleanField(default=True)
         granularity = models.SmallIntegerField(default=30)
         # buffer minutes will simply display the booking time length
 shorter: granularity - buffer_minutes
         buffer_minutes = models.SmallIntegerField(default=5)

         # the new 3 fields
         default_notification_mail_body = models.ForeignKey(EmailTemplate,
 null=True, \
 related_name='notification_mail_template')
         default_teacher_confirmation_mail_body =
 models.ForeignKey(EmailTemplate, null=True, \
 related_name='teacher_confirmation_mail_template')
         default_parent_confirmation_mail_body =
 models.ForeignKey(EmailTemplate, null=True, \
 related_name='parent_confirmation_mail_template')

         def __unicode__(self):
                 return u'%s (%s)' % (self.name,
 self.view_start.strftime(DATE_FORMAT))

         def get_status(self):
                 now = datetime.now()
                 if self.view_start <= now and now < self.view_end:
                         if self.edit_start <= now and now < self.edit_end:
                                 return EVENT_LIVE
                         else:
                                 return EVENT_VIEW
                 return EVENT_CLOSED

         def get_status_text(self):
                 return EVENT_STATUS_TEXT[self.get_status()]

         class Meta:
                 ordering = ['-view_start','name']
                 verbose_name = "PTC Event"



 class PtcPeriod(models.Model):
     start_date = models.DateField(default=date.today() +
 timedelta(days=30))
     start_time = models.TimeField(default=time(8,0))
     end_time = models.TimeField(default=time(12,0))
     teacher_blocks = models.SmallIntegerField(default=1)
     ptc_event = models.ForeignKey(PtcEvent)

     def __unicode__(self):
         return u'%s [%s, %s-%s]' % (self.ptc_event.name,
 self.start_date.strftime(DATE_FORMAT),
 self.start_time.strftime(TIME_FORMAT),
 self.end_time.strftime(TIME_FORMAT))

     def start(self):
         return datetime.combine(self.start_date, self.start_time)

     def end(self):
         return datetime.combine(self.start_date, self.end_time)

     def slot_list(self):
         result = []
         step = timedelta(minutes=self.ptc_event.granularity)
         start_time = self.start()
         end_time = self.end()

         cur_time = start_time
         while (cur_time < end_time):
             result.append(cur_time)
             cur_time = cur_time + step

         return result

     def slot_list_text(self):
         result = [ v.strftime(DATETIME_FORMAT) for v in self.slot_list()]
         return result


     class Meta:
         ordering = ['-start_date']
         verbose_name = "PTC Period"
 }}}

 '''forms.py''':


 {{{
 class PtcEventForm(ModelForm):
         # view_start and edit_start = datetime when the ptcevent is
 created
         view_start =
 DateTimeField(widget=SplitSelectDateTimeWidget(hour_step=1, \
                                         minute_step=15, second_step=60,
 twelve_hr=True))
         view_end =
 DateTimeField(widget=SplitSelectDateTimeWidget(hour_step=1, \
                                         minute_step=15, second_step=60,
 twelve_hr=True))
         edit_start =
 DateTimeField(widget=SplitSelectDateTimeWidget(hour_step=1, \
                                         minute_step=15, second_step=60,
 twelve_hr=True))
         edit_end =
 DateTimeField(widget=SplitSelectDateTimeWidget(hour_step=1, \
                                         minute_step=15, second_step=60,
 twelve_hr=True))
         grades =
 ModelMultipleChoiceField(widget=ColumnCheckboxSelectMultiple(),
 required=True, queryset=Grade.objects.all())

         class Meta:
                 model = PtcEvent
                 exclude = ('active', 'granularity', 'buffer_minutes',)

 PtcPeriodFormSetBase_edit = inlineformset_factory(PtcEvent, PtcPeriod,
 extra=0, max_num=10, can_delete=True)

 class PtcPeriodFormSet_edit(PtcPeriodFormSetBase_edit):
         def add_fields(self, form, index):
                 super(PtcPeriodFormSet_edit, self).add_fields(form, index)
                 form.fields['start_date'].widget = SelectDateWidget()
                 form.fields['start_time'].widget =
 SelectTimeWidget(hour_step=1, \
                                         minute_step=15, second_step=60,
 twelve_hr=True)
                 form.fields['end_time'].widget =
 SelectTimeWidget(hour_step=1, \
                                         minute_step=15, second_step=60,
 twelve_hr=True)
                 form.fields['teacher_blocks'].widget.attrs['size'] = 2
 }}}

 '''views.py''':


 {{{
 def edit_ptc_event(request, ptcevent_id):
         current_selected_event_id = get_current_selected_event_id(request)
         all_ptc_events = get_all_active_events()
         staff = request.user
         page_title = "Edit PTC Event"
         if request.method == 'POST':
                 action = request.POST.get('action')
                 ptc_event_form = PtcEventForm(request.POST, request.FILES)
                 if ptc_event_form.is_valid():
                         if action == u'save':
                                 ptc_event =
 ptc_event_form.save(commit=False)
                                 log_info("ptc event edit %s" %
 str(ptc_event))
                                 ptc_period_formset =
 PtcPeriodFormSet_edit(request.POST, request.FILES, instance=ptc_event)
                                 log_info("ptc_period_formset %s" %
 str(ptc_period_formset))
                                 if ptc_period_formset.is_valid():
                                         ptc_event.save()
                                         ptc_event_form.save_m2m() #
 important!
                                         ptc_period_formset.save()
                         return
 redirect('conferences.staff.views.manage_ptc_events')
                 else:
                         ptc_period_formset =
 PtcPeriodFormSet_edit(request.POST, request.FILES)
         else:
                 ptc_event = PtcEvent.objects.get(pk=ptcevent_id)
                 ptc_event_form = PtcEventForm(instance=ptc_event)
                 ptc_period_formset =
 PtcPeriodFormSet_edit(instance=ptc_event)
         return render_to_response('staff/add_new_ptc_event.html',
 locals(), context_instance=RequestContext(request))
 }}}

 '''add_new_ptc_event.html''' template:


 {{{
 {% extends "staff/base.html" %}
 {% block head_extra %}
 <script src="/site_media/js/jquery.min.js"></script>
 <script src="/site_media/js/addformtoformset.js"></script>
 {% endblock %}

 {% block actionarea %}
 <br>
 <table class="main-title" width="100%">
         <tr>
                 <td><h1>{{ page_title }}</h1></td>
                 <td class="main-button"><a
 href="/staff/ptcevents/all/"><button class="mini button
 gray">Back</button></a></td>
         </tr>
 </table>
 <br>
         {% if ptc_event_form %}

                 <span class="noted">(*) All fields are required!</span>
                 <form method="post" action="" accept-charset="utf-8">
                         <table id="add-ptc-event" class="table-wrapper
 vertical" width="99%" border="0">
                                 <tr>
                                         <th>Name</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.name.errors }}</span>
                                                 {{ ptc_event_form.name }}
                                         </td>
                                 </tr>
                                 <tr>
                                         <th>Description</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.desc.errors }}</span>
                                                 {{ ptc_event_form.desc }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>View start</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.view_start.errors }}</span>
                                                 {{
 ptc_event_form.view_start }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>View end</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.view_end.errors }}</span>
                                                 {{ ptc_event_form.view_end
 }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>Edit start</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.edit_start.errors }}</span>
                                                 {{
 ptc_event_form.edit_start }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>Edit end</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.edit_end.errors }}</span>
                                                 {{ ptc_event_form.edit_end
 }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>Grades</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.grades.errors }}</span>
                                                 {{ ptc_event_form.grades
 }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>Notification mail
 template</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.default_notification_mail_body.errors }}</span>
                                                 {{
 ptc_event_form.default_notification_mail_body }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>Teacher confirmation mail
 template</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.default_teacher_confirmation_mail_body.errors }}</span>
                                                 {{
 ptc_event_form.default_teacher_confirmation_mail_body }}
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>Parent confirmation mail
 template</th>
                                         <td>
                                                 <span class="error">{{
 ptc_event_form.default_parent_confirmation_mail_body.errors }}</span>
                                                 {{
 ptc_event_form.default_parent_confirmation_mail_body }}
                                         </td>
                                 </tr>



                                 <!-- Ptc Period Formset-->

                                 <tr id="vertical-nohover">
                                         <td colspan="2">
                                                 <table class="table-
 wrapper" id="add-ptc-period-table" width="99%">
                                                         <tr><td
 colspan="5" class="radio title">PTC Periods</td></tr>
                                                         <tr>
                                                                 <td
 class="column">Start date</td>
                                                                 <td
 class="column">Start time</td>
                                                                 <td
 class="column">End time</td>
                                                                 <td
 class="column">Teacher blocks</td>
                                                                 <td
 class="column">Action</td>
                                                         </tr>
                                                 {{
 ptc_period_formset.management_form }}
                                                 {% for ptc_period_form in
 ptc_period_formset.forms %}
                                                         <tr class="item">
                                                                 <td
 class="radio">
                                                                         {{
 ptc_period_form.id }}
                                                                         {{
 ptc_period_form.start_date }}
                                                                 </td>
                                                                 <td
 class="radio">
                                                                         {{
 ptc_period_form.start_time }}
                                                                 </td>
                                                                 <td
 class="radio">
                                                                         {{
 ptc_period_form.end_time }}
                                                                 </td>
                                                                 <td
 class="radio textfield">
                                                                         {{
 ptc_period_form.teacher_blocks }}
                                                                 </td>
                                                                 <td><a
 class="delete mini button gray radio" href="#">Delete</a></td>
                                                                         {{
 ptc_period_form.ptc_event.as_hidden }}
                                                         </tr>
                                                 {% endfor %}
                                                         <tr>
                                                                 <td
 colspan="5" class="radio" id="addbtn" style="padding-right: 4px;"><a
 id="add" href="#" class="mini button blue">Add</a></td>
                                                         </tr>
                                                 </table>
                                         </td>
                                 </tr>

                                 <tr>
                                         <th>Action</th>
                                         <td>
                                                 <button type="reset"
 value="Reset" class="medium button gray">Reset</button></a>
                                                 <button type="submit"
 name="action" value="save" class="medium button blue">Save</button>
                                         </td>
                                 </tr>
                         </table>
                         <br>
                 </form>
         {% else %}
                 <p>There's something wrong with the Database! Please
 contact the System Administrator for Support!</p>
         {% endif %}

         <br>
         <br>
 {% endblock %}
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/15574#comment:21>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to