【问题标题】:Upload Image with Django Model Form使用 Django 模型表单上传图像
【发布时间】: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>

注意:表单中的所有其他数据都保存得很好,照片根本没有上传。感谢您的帮助!

【问题讨论】:

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


    【解决方案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')
      

      【讨论】:

        猜你喜欢
        • 2021-12-31
        • 1970-01-01
        • 2020-07-09
        • 1970-01-01
        • 2015-04-27
        • 1970-01-01
        • 1970-01-01
        • 2020-12-13
        • 2017-04-27
        相关资源
        最近更新 更多