Django: странная ошибка IntegrityError при сохранении формы ModelFormset - PullRequest
0 голосов
/ 14 февраля 2011

Я пытаюсь сохранить пару форм ModelFormset, но сталкиваюсь с ошибкой IntegrityError. Вот код:

    billing_formset = BillingFormSet(request.POST,prefix='billing')
    cc_formset = CCFormSet(request.POST,prefix='cc')

    if billing_formset.is_valid() and cc_formset.is_valid():
        bp = UserBillingProfile()
        cc = UserCreditCard()
        for form in billing_formset.forms:
            billing_profile = form.save(commit=False)
            billing_profile.user = request.user
            bp = billing_profile.save()
        for form in cc_formset.forms:
            cc = form.save(commit=False)
            cc.billing_profile = bp
            cc = form.save()

Этот код вызвал следующий код:

IntegrityError at [url удален] (1048, «Столбец« user_billing_profile_id »не может быть пустым»)


РЕДАКТИРОВАТЬ: Вот итерационный код, который также исправляет мою опечатку. Я сталкиваюсь в основном с той же проблемой.

        billing_profile_form = billing_formset.forms[0]
        cc_form = cc_formset.forms[0]

        unsaved_billing_profile = billing_profile_form.save(commit=False)
        user_billing_profile = unsaved_billing_profile.save()

        unsaved_cc = cc_form.save(commit=False)
        unsaved_cc.user_billing_profile = user_billing_profile
        cc = unsaved_cc.save()

Строка проблемы дает: «Невозможно назначить None:« UserCreditCard.user_billing_profile »не допускает нулевые значения». Кажется unsaved_billing_profile.save () возвращает ноль? Почему?


Это отчасти безумие; кажется, все правильно. Я не получаю никаких ошибок при сохранении платежного профиля. Любые идеи о том, что я должен проверить? Кажется, что во втором цикле все идет не так, как кажется, значение bp равно None.

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

1 Ответ

0 голосов
/ 14 февраля 2011

Это означает, что вы пытаетесь сохранить экземпляр модели с установленным для user_billing_profile значением None, похоже, что вы вызываете "billing_profile" вместо "user_billing_profile".

Метод "save" возвращает None каждый раз, когда commit =Ложь не указана.вместо этого вы должны назвать что-то вроде этого:

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