上传图像并使用Django将其显示在网页上

时间:2016-05-20 21:42:14

标签: python django templates url

我是Django的新手,我一直在关注django教程“djangogirl”,但我想添加图片,所以我做了model.py这样:

class Post(models.Model):
   author = models.ForeignKey('auth.User')
   image = models.ImageField()
   title = models.CharField(max_length=200)
   text = models.TextField()
   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

这是我的view.py

def posts(request):
    posts = Post.objects.order_by('published_date')
    return render(request, 'my_blog/posts.html', {'posts': posts})

my_blog.html

{% extends 'my_blog/base.html' %}
{% load staticfiles %}
{% block content %}
<link rel="stylesheet" href="{% static 'style/css/posts.css' %}">

<div id="postsContainer">
    <div id="posts">
        {% for post in posts %}
        <div>
            <h3 class="date">Published the: {{ post.published_date }}</h3>
            <h1><a href="">{{ post.title }}</a></h1>
            <img src="{{ post.image.url }}"/>
            <p>{{ post.text|linebreaks }}</p>
        </div>
        <div id="button">
            <button type="button" class="btn btn-primary">Read more</button>
        </div>
        <div class="top-divider"></div>
        {% endfor %}
    </div>
</div>
{% endblock %}

我通过Django管理页面插入我的图片。

Image insertion

问题是我的HTML中返回的URL非常奇怪,如:./images_SseHlrA.png,它显然没有正确显示图片。我该如何修理它?

显然图片在根级别“存放”(与文件manage.py相同的级别问题是什么?以及如何更改它以及最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您需要指定存储用户上传图片的位置。在models.py

中试试这个
from django.utils.deconstruct import deconstructible

@deconstructible
class PathAndRename(object):

    def __init__(self, sub_path):
        self.path = sub_path

    def __call__(self, instance, filename):
        ext = filename.split('.')[-1]
        # set filename as random string. change here as you want
        filename = '{}.{}'.format(uuid4().hex, ext)
        # return file path
        return os.path.join(self.path, filename)

path_and_rename = PathAndRename("/images")

然后在模特中:

image = models.ImageField(upload_to=path_and_rename)

您可以详细了解ImageField herehere

答案 1 :(得分:1)

alix是正确的,“你需要指定用户上传图像的位置”,方法是在字段构造函数中指定upload_to。但是你不需要一个特殊的类来处理所有这些。方式太复杂了。假设你在你的设置中有这个:

MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
MEDIA_URL = '/uploads/'

在您的模板中,您现在应该可以执行以下操作:

<img src="{{ post.image.url }}">