1

我无法上传图片。

这是我的models.py

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

图片未上传到“post/static/images/”

这是上传图片的模板

    {% if post.media %}
    <img src="{{ post.image.url }}" class="img-responsive" />
    {% endif %}
4

2 回答 2

2

你的代码有很多问题:

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

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

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

  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应该处理图像上传的(函数)视图在哪里。

于 2017-05-16T07:27:42.130 回答
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 -发展

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

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

例如,如果您的 MEDIA_URL 被定义为 /media/,您可以通过将以下代码段添加到您的 urls.py 中来做到这一点:

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

于 2017-05-16T07:08:25.280 回答