使用 Django 模型表单上传图像
Posted
技术标签:
【中文标题】使用 Django 模型表单上传图像【英文标题】:Upload Image with Django Model Form 【发布时间】:2012-10-20 08:23:57 【问题描述】:我在上传以下带有模型表单的模型时遇到了困难。我可以在管理员中正常上传,但这对于限制管理员访问的项目来说并不是那么有用。
#Models.py
class Profile(models.Model):
name = models.CharField(max_length=128)
user = models.ForeignKey(User)
profile_pic = models.ImageField(upload_to='img/profile/%Y/%m/')
#views.py
def create_profile(request):
try:
profile = Profile.objects.get(user=request.user)
except:
pass
form = CreateProfileForm(request.POST or None, instance=profile)
if form.is_valid():
new = form.save(commit=False)
new.user = request.user
new.save()
return render_to_response('profile.html', locals(), context_instance=RequestContext(request))
#Profile.html
<form enctype="multipart/form-data" method="post">% csrf_token %
<tr><td> form.as_p </td></tr>
<tr><td><button type="submit" class="btn">Submit</button></td></tr>
</form>
注意:表单中的所有其他数据都保存得很好,照片根本没有上传。感谢您的帮助!
【问题讨论】:
【参考方案1】:您需要将request.FILES
传递给您的表单:
form = CreateProfileForm(request.POST, request.FILES, instance=profile)
参考:Handling uploaded files with a model
【讨论】:
感谢您的帮助...所以我这样做了,我的实例从表单中消失了...并在表单上显示了一堆验证错误(即使它没有提交)。 【参考方案2】:表单初始化代码必须是这样的:
form = MemberSettingsForm(request.POST or None, request.FILES or None, instance=user)
【讨论】:
我更喜欢这个,因为“或无”【参考方案3】:我想通了。这是我的views.py的问题。您需要设置 request.method == POST 以确保您仍然可以将实例作为表单的一部分。不过效果很好。
#Views.py
def create_profile(request):
try:
profile = Profile.objects.get(user=request.user)
except:
pass
if request.method == 'POST':
form = CreateProfileForm(request.POST, request.FILES)
if form.is_valid():
new = form.save(commit=False)
new.user = profile.user
new.save()
else:
form = CreateProfileForm(request.POST or None, instance=profile)
return render_to_response('profile.html', locals(), context_instance=RequestContext(request))
【讨论】:
【参考方案4】:在保存模型实例之前添加:
new.profile_pic = request.FILES.get('profile_pic')
【讨论】:
以上是关于使用 Django 模型表单上传图像的主要内容,如果未能解决你的问题,请参考以下文章
如何使用ImageField模型调整使用Django上传的图像文件的大小? [关闭]
如何使用 ImageField 模型调整使用 Django 上传的图像文件的大小? [关闭]
Django:无法将上传的图像绑定到表单 ImageField()