我有模特:
class OpenCv(models.Model):
created_by = models.ForeignKey(User, blank=True)
first_name = models.CharField(('first name'), max_length=30, blank=True)
last_name = models.CharField(('last name'), max_length=30, blank=True)
url = models.URLField(verify_exists=True)
picture = models.ImageField(help_text=('Upload an image (max %s kilobytes)' %settings.MAX_PHOTO_UPLOAD_SIZE),upload_to='jakido/avatar',blank=True, null= True)
bio = models.CharField(('bio'), max_length=180, blank=True)
date_birth = models.DateField(blank=True,null=True)
domain = models.CharField(('domain'), max_length=30, blank=True, choices = domain_choices)
specialisation = models.CharField(('specialization'), max_length=30, blank=True)
degree = models.CharField(('degree'), max_length=30, choices = degree_choices)
year_last_degree = models.CharField(('year last degree'), max_length=30, blank=True,choices = year_last_degree_choices)
lyceum = models.CharField(('lyceum'), max_length=30, blank=True)
faculty = models.ForeignKey(Faculty, blank=True,null=True)
references = models.CharField(('references'), max_length=30, blank=True)
workplace = models.ForeignKey(Workplace, blank=True,null=True)
形式:
class OpencvForm(ModelForm):
class Meta:
model = OpenCv
fields = ['first_name','last_name','url','picture','bio','domain','specialisation','degree','year_last_degree','lyceum','references']
和视图:
def save_opencv(request):
if request.method == 'POST':
form = OpencvForm(request.POST, request.FILES)
# if 'picture' in request.FILES:
file = request.FILES['picture']
filename = file['filename']
fd = open('%s/%s' % (MEDIA_ROOT, filename), 'wb')
fd.write(file['content'])
fd.close()
if form.is_valid():
new_obj = form.save(commit=False)
new_obj.picture = form.cleaned_data['picture']
new_obj.created_by = request.user
new_obj.save()
return HttpResponseRedirect('.')
else:
form = OpencvForm()
return render_to_response('opencv/opencv_form.html', {
'form': form,
},
context_instance=RequestContext(request))
但我似乎没有在我的数据库中保存图片 ......出了点问题,我无法弄明白:(
答案 0 :(得分:6)
你不能轻易地帮助你 - 你没有说明实际发生的事情。
但我的猜测是,您的HTML enctype="multipart/form-data"
元素中未包含form
。
我建议阅读the file upload documentation - 你在这里手动做了一些可以由Django为你处理的事情。
答案 1 :(得分:2)
尝试:
filename = file.name
!
http://docs.djangoproject.com/en/dev/topics/http/file-uploads/
答案 2 :(得分:1)
我找到了解决方案:
def save_opencv(request):
if request.method == 'POST':
form = OpencvForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['picture'])
new_obj = form.save(commit=False)
new_obj.created_by = request.user
new_obj.save()
return HttpResponseRedirect('.')
else:
form = OpencvForm()
return render_to_response('opencv/opencv_form.html', {
'form': form,
},
context_instance=RequestContext(request))
和handle_uploaded_file:
def handle_uploaded_file(f):
destination = open('root', 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
请查看缩进。
另外,在models.py
我有:
picture = models.ImageField(help_text=('Upload an image (max %s kilobytes)' %settings.MAX_PHOTO_UPLOAD_SIZE),upload_to='root',blank=True)
请注意我将其保存到root,这意味着我的网站的根,而不是与计算机文件组织相关的任何内容。 此外,代码没什么大不了的,交易是路径 - 我真的不明白如何设置它。 无论如何,希望它能帮到你。
答案 3 :(得分:0)
您的错误在这里:
filename = file['filename']
应该是:
filename = file.name
答案 4 :(得分:0)
改变这个:
fd.write(file['content'])
到
fd.write(file.read())