Python 非空约束失败:表单保存中的所有者\u id
我正在尝试制作一个表单,允许用户上传一个文件(纯文本字典文件)。这是我的模型:Python 非空约束失败:表单保存中的所有者\u id,python,django,web-applications,Python,Django,Web Applications,我正在尝试制作一个表单,允许用户上传一个文件(纯文本字典文件)。这是我的模型: 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.For
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)
这是我的视图代码,它将post数据、文件和用户发送到表单:
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)
由于首先发生错误,因此从不运行断言行。生成的错误在视图代码中,位于form.save()
。生成的错误是:
django.db.utils.IntegrityError: NOT NULL constraint failed: dic_dictionary.owner_id
两个问题。如何正确设置表单中的所有者值以避免出现此错误?既然是否有效()
应该检查是否不会发生错误,那么为什么在表单.save()
行上会出现错误?是否有效()
只验证表单中指定的字段(在本例中为-文件
)。表单是有效的-但稍后会出现错误,因为保存时未满足其他模型字段约束
将所有者
传递给表单将不起作用,因为表单没有处理该字段。相反,您需要在表单验证后,但在保存之前,将所有者添加到模型中:
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')
(同时删除表单上的\uuuuu init\uuuu
方法)