2016-05-20 232 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