图像上传字段在Django中不起作用

时间:2016-02-29 23:14:22

标签: django django-forms django-templates django-views imagefield

我正在尝试渲染一个将上传图片的表单。但我没有得到它。

这里是models.py:

profile_picture = models.ImageField(_('profile picture'),upload_to="profile_pictures" , blank=True, null=True,default="static/images/person.jpg")
forms.py中的

class UploadProfilePictureForm(forms.Form):
    profile_picture=forms.ImageField(label='Select an Image')
在views.py中

def add_profile_picture(request):
if request.method=='POST':
    form=UploadProfilePictureForm(request.POST,request.FILES)
    p=FearUser(profile_picture=request.FILES['profile_picture'])
    p.save()
    return HttpResponseRedirect(reverse('profile:my_profile'))
else:
    form=UploadProfilePictureForm
return render_to_response('partials/_add_profile_picture.html',{'form':form},context_instance=RequestContext(request))
在urls.py中

url(r'^profile/update-pp/$','profiles.views.add_profile_picture',name='pp_update')

最后在_add_profile_picture.html:

            <form action="{% url 'profile:pp_update' %}" role="form" method="post" enctype="multipart/form-data">
                {% csrf_token %}

                <p>{{ form.profile_picture.label_suffix }}</p>
                <p>
                    {{ form.profile_picture.error_messages }}
                    {{ form.profile_picture }}
                </p>
                <div class="text-right">
                    <button type="button" class="btn btn-default custom_btn cancel_btn"
                            style="padding:5px 20px" data-dismiss="modal">Cancel
                    </button>
                    <button type="submit" class="btn btn-default custom_btn submit_btn"
                            style="padding:5px 20px">Submit
                    </button>
                </div>
            </form>

有谁能解释一下我做错了什么?

5 个答案:

答案 0 :(得分:0)

如果没有您的某些更具体的调试信息,我无法完全确定您的意思&#34;没有得到它&#34;。

你可能会尝试一些事情:

1)实际验证表格(良好做法)。

2)从经过验证的表格中提取图像。 (也是很好的做法)。

if form.is_valid():
    form = UploadProfilePictureForm(request.POST, request.FILES)
    p = FearUser(profile_picture=form.cleaned_data['profile_picture'])
    p.save()

为了帮助调试任何实际的图片上传问题,请在save之后输入一份打印声明:

print p.profile_picture.url并查看输出结果。如果它没有,或者不是你所期望的,那么你的储蓄就不对了。

您还可以print request.FILES并确保实际上传工作正常。

如果您对结果发表评论,我可以尝试帮助缩小范围。

答案 1 :(得分:0)

您的问题很可能属于settings.py中的错误设置。 这就是我在我的项目中所拥有的,它正在工作,尝试复制它,并且如果它正在工作则首先尝试管理员。至少我们会知道问题是在您的设置/模型中还是在您的视图中。

创建路径appdirectory / static / images,导致不确定Django是否正在创建它以防不存在。

settings.py

PROJECT_ROOT = path.dirname(path.abspath(path.dirname(__file__)))
MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
MEDIA_URL = '/media/'
STATIC_ROOT = path.join(PROJECT_ROOT, 'static').replace('\\', '/')
STATIC_URL = '/static/'
STATICFILES_DIRS = ()

在已安装的应用中添加'django.contrib.staticfiles'。

models.py

   Pic = models.ImageField(upload_to='images/WaterMeterPictures/', blank=False, null=False) 

一旦管理员工作正常,表单生成应该是直截了当的。

答案 2 :(得分:0)

你有 Pillow 吗?

答案 3 :(得分:0)

由于您还没有使用form.is_valid(),因此您的表单未绑定且form.cleaned_data不存在。一旦运行form.is_valid(),您就可以访问cleaning_data。

答案 4 :(得分:0)

@login_required
def createPost(request):
if request.method == 'POST':
        form = PostForm(request.POST,request.FILES)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user

            post.save()
            return HttpResponseRedirect(reverse('Posts:post_detail', kwargs={'slug': post.slug}))

    form = PostForm()
    return render(request,'Posts/post_form.html',context={'key': form})

models.py

class Post(models.Model):
    user = models.ForeignKey(User, related_name='posts', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)
    message = models.TextField()
    img = models.ImageField(upload_to="photo/%Y/%m/%d", blank=True)
    post_title = models.CharField(max_length=80, blank=False)
    slug = models.SlugField(allow_unicode=True, unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.post_title)
        super().save(*args, **kwargs)

    def __str__(self):
        return self.post_title

    # def get_absolute_url(self):
    #     return reverse('home')
    def get_absolute_url(self):
        return reverse('Posts:post_detail', kwargs={'slug': self.slug})

    class Meta:
        ordering = ['-created_at']