2016-05-20 113 views
0
在网页上显示它

我是新的Django和我一直在关注Django的教程“djangogirl”但我想添加图片,所以我做了一个model.py这样的:上传图片并使用Django

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这个问题是为什么呢?我能怎样改变的,什么是这样做的最好方法是什么?

回答

1

阿利克斯是正确的,“你需要指定存储用户上传的图片”在该领域的构造函数指定upload_to。但是你不需要一个特殊的类来处理所有这些。太复杂了。比方说,你在你的设置有这样的:

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

在模板中,你现在应该可以做一些事情,如:

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

好,谢谢,现在我有一个正常的URL“/上传/插图/ images.png”。但仍然无法找到图片。 “上传”文件夹是在根目录下创建的,并且图像存储在目录中,我应该在模板中导入某些内容?就像我为静态文件所做的那样:{%load staticfiles%} – mel

+1

如果您在呈现的页面上查看源代码,那么为图像指定了哪个URL?现在检查Django文档中的MEDIA_URL https://docs.djangoproject.com/en/1.9/ref/settings/#media-url - 您的设置和工作是否正确? MEDIA_URL和MEDIA_ROOT用于确定上传媒体的位置。 – shacker

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) 

您可以阅读米矿石约ImageFieldherehere