Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 非空约束失败:表单保存中的所有者\u id_Python_Django_Web Applications - Fatal编程技术网

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
方法)