无法使用filefield在django上传图像

时间:2017-05-16 06:58:09

标签: python django django-models django-uploads

我无法上传图片。

这是我的 models.py

mySurface

图片未上传至 ' post / static / images /'

这是上传图片的模板

class Post(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    image = models.FileField(upload_to = 'post/static/images/' , null= True, blank= True)
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

2 个答案:

答案 0 :(得分:2)

您的代码存在许多问题:

  1. 在您的模型中 - 使用该字段进行图片上传ImageField(使用ImageField您需要安装Pillow):

    image = models.ImageField(upload_to = 'images/' , null= True, blank= True)
    

    (您将图片上传到名为images的MEDIA_ROOT文件夹的子文件夹中

  2. 同时将图片放入媒体文件夹 - 您必须创建一个,在 settings.py 文件夹中添加:

    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media/')
    
  3. 要让django为您的媒体服务(仅用于开发!),您必须添加主要内容(来自您的项目目录,而不是来自您的应用程序文件夹) urls.py 文件:

    from django.conf import settings
    from django.conf.urls.static import static
    
    if settings.DEBUG:
        urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
    
  4. 上传图片的简单表单示例:

    <form action="{% url upload_pic %}" method="post" enctype="multipart/form-data">{% csrf_token %}
        <input id="id_image" type="file" class="" name="image">
        <input type="submit" value="Submit" />
    </form>
    

    其中url_upload_pic是应该处理图像上传的(功能)视图。

答案 1 :(得分:1)

我认为也是一件好事。

  

MEDIA_ROOT和STATIC_ROOT必须具有不同的值。之前   STATIC_ROOT被引入,通常依赖或后备   MEDIA_ROOT也提供静态文件;但是,因为这可以   严重的安全隐患,有一个验证检查,以防止   它

https://docs.djangoproject.com/en/1.11/ref/settings/#media-root

您想要做的(在开发中)是遵循本指南: https://docs.djangoproject.com/en/1.11/howto/static-files/#serving-files-uploaded-by-a-user-during-development

  

在开发过程中,您可以从中提供用户上传的媒体文件   MEDIA_ROOT使用django.views.static.serve()视图。

     

这不适合生产使用!对于一些常见的部署   策略,请参阅部署静态文件。

     

例如,如果您的MEDIA_URL定义为/ media /,则可以执行此操作   将以下代码段添加到您的urls.py:

基本上,您将文件更新到MEDIA_ROOT中的某个位置,然后告诉django将它们视为静态处理。但是你不能直接上传到静态。