Django表单字段在保存时丢失
我有一个用户填写的表单,这个表单是根据一个模型生成的。这个模型里有一个外键指向一个叫“Section”的部分。当我提交表单时,出现了一个完整性错误(IntegrityError),提示“section_id”这一列不能为null。我原以为这个问题很简单,但开始处理后发现并不是这样。这个bug只在我的开发服务器上出现(CentOS 5.5)。在我的本地环境(Mac OS X 10.5.8)上没有这个问题。
我进入了python的命令行,检查了表单对象;我发现“section”这个字段(form.fields.section)在我的开发环境中缺失。我的项目代码和django版本在本地和开发环境中都是一样的。更让我沮丧的是,用户填写的表单确实有一个隐藏的“section”字段,但当这些数据提交到视图时,这个表单字段就消失了。如果有人能帮我分析一下这个bug的原因,我将非常感激,这样我就不用花钱买生发水了。
提前谢谢你们,
Chris。
代码:
views.py
def event_registration(request, slug):
section = get_object_or_404(Section, section__slug=slug)
parent_page = Page.objects.get(section=section, slug='overview')
page = Page.objects.get(section=section, slug='events-registration')
form = EventRegistrationForm(label_suffix='')
submitted = False
if request.POST.has_key('event'):
form = EventRegistrationForm(request.POST)
if form.is_valid():
form.save()
submitted = True
context = RequestContext(request)
return render_to_response('section/event_registration.html',
{
'section': section,
'page': page,
'form': form,
'submitted': submitted
},
context_instance=context)
forms.py
class EventRegistrationForm(better_forms.BetterModelForm):
class Meta:
model = EventRegistration
fieldsets = [
('Step 1', {
'fields': ['event', 'guests']
}),
('Step 2', {
'fields': ['first_name', 'email', 'last_name', 'phone', 'school_name']
}),
]
models.py
class EventRegistration(models.Model):
section = models.ForeignKey(Theater, verbose_name=_('Section'),
help_text=_("The Site Section"))
event = models.ForeignKey(Event, verbose_name=_('Event'))
guests = models.IntegerField(_('Number of Guests?'))
first_name = models.CharField(_('First Name'), max_length=100)
last_name = models.CharField(_('Last Name'), max_length=100)
email = models.CharField(_('E-Mail Address'), max_length=255)
phone = PhoneNumberField(_('Daytime Phone Number'))
school_name = models.CharField(_('School Name'), max_length=200, blank=True, null=True)
2 个回答
0
Chris,
这听起来像是你的数据库版本不一致的问题。你是在不同的时间同步数据库,还是在开发服务器和本地机器上使用了不同的数据库?你能把完整的模型和表单发出来作为例子吗?
0
试试这个来处理你的视图:
def event_registration(request, slug):
section = get_object_or_404(Section, section__slug=slug)
parent_page = Page.objects.get(section=section, slug='overview')
page = Page.objects.get(section=section, slug='events-registration')
eventr = EventRegistration(section=section)
submitted = False
if request.method == 'POST':
form = EventRegistrationForm(request.POST, instance=eventr)
if form.is_valid():
form.save()
submitted = True
else:
form = EventRegistrationForm(label_suffix='', instance=eventr)
context = {
'section': section,
'page': page,
'form': form,
'submitted': submitted
}
return render_to_response('section/event_registration.html', context,
context_instance=RequestContext(request))
补充说明:
从技术上讲,如果你只是修改了
form.save()
to
instance = form.save(commit=False)
instance.section=section
instance.save()
那样也可以。你需要在把新的事件注册信息保存到数据库之前,先填写好这个事件注册的部分字段。