使用Django Model Form上传图片

时间:2012-10-30 22:23:59

标签: django django-models django-forms django-file-upload

我在使用模型表单上传以下模型时遇到了困难。我可以在管理员中上传,但对于限制管理员访问的项目而言,这并不是那么有用。

#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>

注意:表单中的所有其他数据都可以很好地保存,照片根本不会上传。谢谢你的帮助!

4 个答案:

答案 0 :(得分:5)

您需要将request.FILES传递给您的表单:

form = CreateProfileForm(request.POST, request.FILES, instance=profile)

参考:Handling uploaded files with a model

答案 1 :(得分:1)

在保存模型实例之前添加:

 new.profile_pic = request.FILES.get('profile_pic')

答案 2 :(得分:1)

表单初始化代码必须如下:

form = MemberSettingsForm(request.POST or None, request.FILES or None, instance=user)

答案 3 :(得分:0)

我明白了。这是我的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))