Django表单字段在保存时丢失

0 投票
2 回答
2035 浏览
提问于 2025-04-16 13:10

我有一个用户填写的表单,这个表单是根据一个模型生成的。这个模型里有一个外键指向一个叫“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()

那样也可以。你需要在把新的事件注册信息保存到数据库之前,先填写好这个事件注册的部分字段。

撰写回答