#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.