我是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管理页面插入我的图片。
问题是我的HTML中返回的URL非常奇怪,如:./images_SseHlrA.png
,它显然没有正确显示图片。我该如何修理它?
显然图片在根级别“存放”(与文件manage.py
相同的级别问题是什么?以及如何更改它以及最佳方法是什么?
答案 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)
答案 1 :(得分:1)
alix是正确的,“你需要指定用户上传图像的位置”,方法是在字段构造函数中指定upload_to
。但是你不需要一个特殊的类来处理所有这些。方式太复杂了。假设你在你的设置中有这个:
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')
MEDIA_URL = '/uploads/'
在您的模板中,您现在应该可以执行以下操作:
<img src="{{ post.image.url }}">