django - 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
为什么我会收到此错误以及如何解决此问题?
解决方案
你没有设置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。
推荐阅读
- wpf - WPF DataGrid 可编辑 GroupDescriptions
- java - 如何在 JNI 中将 char* 强制转换为 jbyteArray 而没有 malloc 一个新的内存区域
- mysql - 选择是否加入一张表 否则加入另一张表
- objective-c - Objective C 长期作为 int 桥接到 Swift?
- javascript - React Native:如何在渲染屏幕之前立即获取数据?
- .net - web.config 中 system.web 和 system.webServer 中的授权之间的区别?
- java - Jeddict 插件安装失败 - Apache Netbeans 12 - 缺少“Maven 项目”插件依赖项
- javascript - 从 js 中为 Chrome 扩展查找 html 中的元素
- mysql - 在 MySQL 中搜索
- python - Python 嵌套字典导致 {}