python - Django IntegrityError 列 "author_id"中的 null 值违反了非空约束

标签 python django postgresql django-forms django-views

我正在尝试保存一个接受用户输入的表单。我收到完整性错误。有人可以帮我吗?我看到人们使用了 request.user.username 但我不知道如何在我的表单中使用它。请不要介意这些代码,因为我仍在尝试解决 Django 中的问题。

以下是我的文件:

models.py

class CommonModel(models.Model):

    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=400)
    comments = models.TextField(blank=True)
    requirements = JSONField(default = {})
    specs = JSONField(default= {})
    created_date = models.DateTimeField(default=timezone.now)
    updated_date = models.DateTimeField(blank=True, null=True)

    class Meta:
       abstract = True

    def update(self):
        self.updated_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title


class Item(CommonModel):

    HW = 'HW'
    NW = 'NW'
    SW = 'SW'
    VM = 'VM'
    WI = 'WI'
    SI = 'SI'
    ITEM_TYPES = (
        (HW, 'Hardware'),
        (NW, 'Network'),
        (SW, 'Software'),
        (VM, 'Virtual Machine'),
        (WI, 'Work Item'),
        (SI, 'Support Item'), 
    )

    UNIT_LOE = 'LOE'
    UNIT_USD = 'USD'
    UNIT_TYPES = (
        (UNIT_LOE, 'LOE,MD'),
        (UNIT_USD, 'USD'),
    )

    item_type = models.CharField(default='HW', max_length=5, choices=ITEM_TYPES)
    unit_type = models.CharField(default='USD', max_length=5, choices=UNIT_TYPES)
    otc_price = models.DecimalField(default='0.0', max_digits=10, decimal_places=2)
    annual_price = models.DecimalField(default='0.0', max_digits=10, decimal_places=2)
    gp_code = models.TextField(default='Unknown')
    class Meta:
       abstract = True

class ItemTemplate(Item):
    pass
   # Need ID here to relate to estimate

class ItemObject(Item):
    pass

这是我的 admin.py

class CommonAdmin(admin.ModelAdmin):

    formfield_overrides = {
        JSONField:{ 'widget':JSONEditor },
    }

    def otc_price(self,obj):       
        return json_prettified(obj.otc_price)
    def annual_price(self,obj):       
        return json_prettified(obj.annual_price)

from reversion.admin import VersionAdmin

@admin.register(ItemTemplate)
class ItemTemplateAdmin(VersionAdmin):
     list_display = ('title', 'item_type', 'unit_type', 'otc_price','annual_price')
     formfield_overrides = {
        JSONField:{ 'widget':JSONEditor },
     }

@admin.register(ItemObject)
class ItemObjectAdmin(VersionAdmin):
     list_display = ('title', 'item_type', 'unit_type', 'otc_price','annual_price')
     formfield_overrides = {
        JSONField:{ 'widget':JSONEditor },
     }

最后是views.py。

def order_create(request):
        cart = ItemObject.objects.all()

        if request.method == 'POST':
            form = ItemObjectCreateForm(request.POST)
            if form.is_valid():
                form.save()
                for item in cart:
                    annual_price = 122
                    otc_price=100
                    # Logic to calculate the price and put it in estimate table
                    ItemObject.objects.create(
                                             requirements=item.requirements,
                                             specs=item.specs,
                                             annual_price = annual_price,

                    )
                # clear the cart
                #cart.clear()
                order_created()
                # redirect to the payment
                return redirect('success.html')

        else:
            form = ItemObjectCreateForm()
        return render(request,
                      'index.html',
                      {'cart': cart, 'form': form})

在这里,我尝试将数据存储到 ItemObject,但在提交表单时出现错误。

IntegrityError: null value in column "author_id" violates not-null constraint
DETAIL:  Failing row contains 

我的 forms.py 如下所示

class ItemObjectCreateForm(forms.ModelForm):
    class Meta:
        model = ItemObject
        fields = ['title','requirements', 'gp_code', 'specs','author', 'item_type', 'unit_type','comments', 'id'
                  ]

正在附加数据库 enter image description here

最佳答案

保存表单时,set commit argument设置为 false 以防止立即保存对象,

item = form.save(commit=False)
item.author = request.user
item.save()

并修改

ItemObject.objects.create( author=request.user, requirements=item.requirements, specs=item.specs, annual_price = annual_price, )

关于python - Django IntegrityError 列 "author_id"中的 null 值违反了非空约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47627344/

相关文章:

python - 如何有条件地跳过pd.read_html()中不包含表的html文件?

python - 安装 Flask 1.0.2(Jinja2 和 Werkzeug)时的需求问题

python - 无法上传项目 - appcfg.py 权限被拒绝

javascript - 将数据从 Django 传递到 D3

postgresql - 将 CSV 文件导入 postgres - 跳过第一行

postgresql - postgres "idle in transaction"13 小时

python - 如何将版本号字符串存储在 django 数据库中,以便它们可以正确比较/排序

python - Python/Django 中的 Unicode 与 UTF-8 混淆?

python - 新手 Django : Creating a project with several apps or all in one

django - 通过 Django 创建数据库约束