Django表单字段在保存时丢失

时间:2011-03-07 16:54:21

标签: python django

我有一个面向用户的表单,它是从模型生成的。该模型具有站点“Section”的外键。当我提交表单时,它返回IntegrityError(列“section_id”中的空值违反非空约束)。在我开始研究之前,我认为问题很简单。该错误仅发生在我的开发服务器上(CentOS版本5.5(最终版))。我在本地环境中没有这个问题(Mac OS X 10.5.8)。

我进入了python shell并检查了表单对象;我注意到我的开发环境中缺少“section”字段(form.fields.section)。项目代码和django版本在我的本地和dev上都是相同的。令我沮丧的是,面向用户的表单确实有一个隐藏的“部分”字段,但是当该数据发布到视图时,表单字段不再存在。任何对这个错误原因的见解都会非常感激,并且免除了Rogaine的费用。

提前致谢, 克里斯。

代码:

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 :(得分:0)

克里斯,

这听起来像是您的数据库不是同一个版本的问题。您是在不同时间同步数据库还是在开发服务器和本地计算机上使用不同的数据库?您还可以发布完整的模型和表格作为示例吗?

答案 1 :(得分: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()

本来也会奏效。在将新的EventRegistration提交给db之前,您需要填写新的EventRegistration的section字段。