gpt4 book ai didi

python - NOT NULL 约束失败 : owner_id in form saving

转载 作者:行者123 更新时间:2023-11-30 22:52:04 24 4
gpt4 key购买 nike

我正在尝试制作一个允许用户上传文件(纯文本字典文件)的表单。这是我的模型:

from django.conf import settings
from django.db import models
import uuid


class Dictionary(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
owner = models.ForeignKey(settings.AUTH_USER_MODEL)
file = models.FileField(upload_to='uploads/%y/%m/%d')
timestamp = models.DateTimeField(auto_now_add=True)

这是我使用的表格。我只想公开文件参数供用户设置。我打算从请求用户设置的所有者:

from django.forms import ModelForm

from dic.models import Dictionary


class DictionaryForm(ModelForm):

class Meta:
model = Dictionary
fields = ['file']

def __init__(self, owner, *args, **kwargs):
self.owner = owner
super().__init__(*args, **kwargs)

这是我的 View 代码,它将发布数据、文件和用户发送到表单:

from django.contrib.auth.decorators import login_required
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render

from dic.forms import DictionaryForm

@login_required
def upload(request):
if request.method == 'POST':
form = DictionaryForm(request.user, request.POST, request.FILES)
if form.is_valid():
form.save()
return HttpResponseRedirect('/dic/upload_success')
else:
form = DictionaryForm(request.user)
return render(request, 'dic/upload.html', {'form': form})

这是我失败的测试代码:

def test_can_upload_file(self):
user = User.objects.create(username='foo')
user.save()
self.client.force_login(user)
self.assertEqual(Dictionary.objects.count(), 0)

file = StringIO(initial_value='fake data here')
response = self.client.post('/dic/upload', {'file':file})
self.assertEqual(response.status_code, 200)

断言行永远不会运行,因为首先发生错误。生成的错误位于 View 代码中的 form.save() 处。生成的错误是:

django.db.utils.IntegrityError: NOT NULL constraint failed: dic_dictionary.owner_id

两个问题。如何正确设置表单中的所有者值以避免出现此错误?为什么错误发生在 form.save() 行,因为 is_valid() 应该检查不会发生错误?

最佳答案

is_valid() 仅验证您在表单中指定的字段(在本例中为 file)。该表单是有效的 - 但稍后您会收到错误,因为保存时不满足其他模型字段约束。

所有者传递给表单将不起作用,因为表单不处理该字段。相反,您需要在表单验证后、保存之前将 owner 添加到模型中:

if request.method == 'POST':
form = DictionaryForm(request.POST, request.FILES)
if form.is_valid():
obj = form.save(commit=False)
obj.owner = request.user
obj.save()
return HttpResponseRedirect('/dic/upload_success')

(同时删除表单上的 __init__ 方法)。

关于python - NOT NULL 约束失败 : owner_id in form saving,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38787689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com