Поле формы Django отсутствует при сохранении - PullRequest
0 голосов
/ 07 марта 2011

У меня есть пользовательская форма, сгенерированная из модели.Модель имеет внешний ключ к сайту «Section». Когда я отправляю форму, она возвращает IntegrityError (нулевое значение в столбце «section_id» нарушает ограничение not-null).Я думал, что проблема была проста, пока я не начал работать над этим.Ошибка возникает только на моем сервере разработки (CentOS выпуск 5.5 (Final)).У меня нет этой проблемы в моей локальной среде (Mac OS X 10.5.8).

Я вошел в оболочку python и осмотрел объект формы;Я заметил, что поле «раздел» (form.fields.section) отсутствовало в моем dev env.И код проекта, и версия django идентичны на моем локальном компьютере и dev.К моему разочарованию добавляется тот факт, что форма, обращенная к пользователю, имеет скрытое поле «раздел», но когда эти данные публикуются в представлении, поле формы больше не существует.Любое понимание причины этой ошибки будет высоко оценено и спасет меня от расходов Рогейна.

Заранее спасибо, Крис.

Код:

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 голосов
/ 07 марта 2011

Попробуйте это на ваш взгляд:

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, прежде чем отправить его в базу данных.

0 голосов
/ 07 марта 2011

Крис,

Похоже, проблема в том, что ваша база данных не совпадает с версией. Вы синхронизировали свои базы данных в разное время или используете разные базы данных на своем сервере разработки и локальном компьютере? Вы также можете опубликовать полную модель и форму в качестве примера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...