首页 > 解决方案 > Django文件上传:完整性错误

问题描述

这就是我得到的

IntegrityError at /malex/upload/
NOT NULL constraint failed: malex_document.uploaded_by_id
Request Method: POST
Request URL:    http://127.0.0.1:8000/malex/upload/
Django Version: 2.0.5
Exception Type: IntegrityError

楷模

class Profile(models.Model):
    username = models.OneToOneField(User, on_delete=models.CASCADE)
    password = models.TextField(max_length=80,blank=True)

class Document(models.Model):
    docfile = models.FileField(upload_to='documents/%Y/%m/%d')
    uploaded_by = models.ForeignKey(Profile,on_delete=models.CASCADE)
    date_uploaded = models.DateTimeField(auto_now_add=True)

形式

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput)

class DocumentForm(forms.Form):
    docfile = forms.FileField(label='Select a file')

意见

def upload(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile=request.FILES['docfile'])
            newdoc.save()
            **newdoc.uploaded_by = request.user.profile**
            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('upload'))
    else:
        form = DocumentForm()  # A empty, unbound form

    # Load documents for the list page
    documents = Document.objects.all()

    # Render list page with the documents and the form
    return render(request,'upload.html',{'documents': documents, 'form': form})  

如果我像 neverwalker 单独建议的那样添加该行

'AnonymousUser' object has no attribute 'profile'

这个完整性错误甚至让事情变得更奇怪的是文件已上传

~/nup/malex/media/documents/2018/06/22$ ls -lh 262_V01_C06_R000_TEy_BH_131072H.ats
-rw------- 1 milenko milenko 46M јун 22 07:22 262_V01_C06_R000_TEy_BH_131072H.ats

为什么我会收到此错误以及如何解决此问题?

标签: django

解决方案


你没有设置uploaded_by属性。由于它不可为空,这是引发错误。要解决此问题,您需要uploaded_by在保存之前提供给新的 Document 实例,如下所示:

@login_required
def upload(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile=request.FILES['docfile'])
            newdoc.uploaded_by = request.user.profile # if Profile has onetofield with User model
            # newdoc.uploaded_by = request.user if Profile is your user_model 
            newdoc.save()

注意使用 login_required 装饰器来确保当前用户已通过身份验证。

您也可以设置uploaded_by为可为空的字段:

uploaded_by = models.ForeignKey(Profile, on_delete=models.CASCADE, null=True)

在这种情况下uploaded_by不需要,并将设置为新记录的 ULL。


推荐阅读