django save()被禁止以防止由于未保存的相关对象而导致数据丢失 [英] django save() prohibited to prevent data loss due to unsaved related object

查看:332
本文介绍了django save()被禁止以防止由于未保存的相关对象而导致数据丢失的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用inlineformset创建一个父模型和一些子模型。以下是我的看法。该代码可用于将初始Rfq模型保存到数据库中,但是在尝试将行保存到inlineformset中时出错。这是一对多关系,但是使用ForeignKey字段完成。

I am trying to use an inlineformset to create a parent model and some children models. Below is my view. The code works in saving the initial Rfq model to the database, but errors when it tries to save the lines inlineformset. This is a one-to-many relationship, but is done using the ForeignKey field.

# views.py
def rfq_create(request):
    form = RfqForm(request.POST or None)
    RfqFormSet = inlineformset_factory(Rfq, Rfqlines, form=RfqlinesForm, extra=5, can_delete=True)
    lines_formset = RfqFormSet(request.POST or None)
    title = "Create a new RFQ"
    context = {
        "title": title,
        "form": form,
        "lines_formset": lines_formset,
    }

    if form.is_valid() and lines_formset.is_valid():
        rfq = form.save(commit=False)
        rfq.user = request.user
        rfq.save()
        lines_formset.save()
        rfq_list = Rfq.objects.order_by('rfq_id')[:20]
        title = "RFQ List"
        context = {
            "title": title,
            "rfq_list": rfq_list
        }
        return render(request, "rfq.html", context)

    return render(request, "rfq_create.html", context)

我曾尝试查看Django的官方文档,但它似乎并不适用...还是不是那么简单。

I've tried looking at the official Django docs, but it doesn't seem to apply ... or isn't that straightforward anyways.

这是我的回溯

Environment:


Request Method: POST
Request URL: http://localhost:8000/rfq/create

Django Version: 1.8.7
Python Version: 3.4.3
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.sites',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django.contrib.humanize',
 'django.forms.formsets',
 'jquery',
 'crispy_forms',
 'registration',
 'home',
 'rfq',
 'dashboard',
 'pipeline')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Traceback:
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/core/handlers/base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/brandon/employees/rfq/views.py" in rfq_create
  36.         lines_formset.save()
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/forms/models.py" in save
  636.         return self.save_existing_objects(commit) + self.save_new_objects(commit)
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/forms/models.py" in save_new_objects
  767.             self.new_objects.append(self.save_new(form, commit=commit))
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/forms/models.py" in save_new
  900.             obj.save()
File "/home/brandon/employees/env/lib/python3.4/site-packages/django/db/models/base.py" in save
  685.                         "unsaved related object '%s'." % field.name

Exception Type: ValueError at /rfq/create
Exception Value: save() prohibited to prevent data loss due to unsaved related object 'rfq'.


推荐答案

问题的答案是这样

lines_formset = RfqFormSet(request.POST or None, instance=form.instance)

form.instance是被忽略的键。

the form.instance was the key that was overlooked.

这篇关于django save()被禁止以防止由于未保存的相关对象而导致数据丢失的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆