【问题标题】:Django 1.9 - Not displaying user uploaded imagesDjango 1.9 - 不显示用户上传的图像
【发布时间】:2016-05-04 23:38:27
【问题描述】:

我正在尝试显示用户已上传的图像,但无论我尝试什么,我都会收到损坏的链接图标。我已经在 SO 和其他地方搜索并搜索了几天的文档,但无济于事。我是 Django 新手,目前正在开发中,所以我确信我犯了一些其他新手错误,但现在我唯一关心的是在模板中显示上传的图像。

这是我的代码的相关sn-ps:

settings.py

MEDIA_URL = '/media/media_root/'
MEDIA_ROOT = os.path.join(os.path.dirname(BASE_DIR), "media", "media_root")

urls.py

urlpatterns = [
    url(r'^admin/?', admin.site.urls),
    url(r'^accounts/', include('registration.backends.simple.urls')),
    url(r'^about/?', profiles.views.about, name='about'),
    url(r'^properties/single/?', properties.views.single, name='single_mens'),
    url(r'^properties/married/?', properties.views.married, name='married'),
    url(r'^properties/add/add_photos/?', properties.views.add_photos, name='add_photos'),
    url(r'^properties/add/?', properties.views.add_rental, name='add_rental'),
    url(r'^', profiles.views.home, name='home'),
] 

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()

models.py

class RentalPicModel(models.Model):

    def __unicode__(self):
        return self.image.url

    image = models.ImageField(upload_to="pics/originals/", null=True)
    rental = models.ForeignKey(RentalModel, on_delete=models.CASCADE)

forms.py

class AddPhotosForm(forms.ModelForm):

    class Meta:
        model = RentalPicModel
        fields = ['image', 'rental']

    def clean_image(self):
        return self.cleaned_data['image']

    def clean_rental(self):
        return self.cleaned_data['rental']

views.py

def add_photos(request):

    form = AddPhotosForm
    current_rental = None
    current_photos = []
    if request.method == "POST":
        form = AddPhotosForm(request.POST, request.FILES)
        if request.POST.get('another'):
            if form.is_valid():
                cleaned_image = form.cleaned_data['image']
                cleaned_rental = form.cleaned_data['rental']
                current_rental = cleaned_rental

                pic = RentalPicModel(image=cleaned_image, rental=cleaned_rental)
                pic.save()

        current_photos = RentalPicModel.objects.filter(rental=current_rental)
        current_photos = [rental.image for rental in current_photos]
        for photo in current_photos:
            print photo

    context = {
        'form' : form,
        'photos' : current_photos,
    }

    return render(request, "add_photos.html", context)

print 语句的输出(上传一张照片后)是:pics/originals/DSC_1376.jpg,我可以看到文件已保存到该位置。

add_photos.html

    <div class="container">
        <h1>Upload your photos here.</h1>
        <br>
        <div class='row'>
            <form method="POST" action="" enctype="multipart/form-data"> {% csrf_token %}
                {{ form|crispy }}
                <div class='col col-xs-3'></div>
                <div class='col col-xs-3'>
                    <input class="btn btn-block btn-info" name="another" type="submit" value="Save and Add Another">
                </div>
                <div class='col col-xs-3'>
                    <input class="btn btn-block btn-primary" name="finish" type="submit" value="Save and Finish">
                </div>
                <div class="col col-xs-3"></div>
            </form>
        </div>

        {% if photos|length > 0 %}
            <h2>Uploaded photos:</h2>
            {% for photo in photos %}
                <div class='row'>
                    <img src="{{ photo.url }}" alt="">
                </div>
            {% endfor %}
        {% endif %}
    </div>

当我检查&lt;img&gt; 元素时,我看到src="/media/media_root/pics/originals/DSC_1376.jpg" 它给了我一个http://127.0.0.1:8000/media/media_root/pics/originals/DSC_1376.jpg 的URL。对我来说,这似乎是正确的文件位置,但它仍然没有显示。

就像我说的那样,在我看来,一切似乎都是在 Django 文档和我在 SO 上阅读的所有其他问题中描述的。我错过了什么?

提前谢谢你。

编辑

我是否需要为上传的媒体修改我的STATICFILES_DIRS 设置?这是我现在拥有的:

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, "static_files"),
)

这是我放置所有 CSS 和 javascript 文件的地方。

【问题讨论】:

  • 您是否得到文件的 404 或者它是“不显示”,如“损坏”。也许是一个 0 kB 的文件?
  • @C14L 它只显示损坏的图像图标。我检查了文件,它就在那里,而且肯定大于 0 kB。

标签: django django-1.9


【解决方案1】:

您忘记连接 MEDIA_URL{{ photo.url }}

试试:

<img src="{% get_media_prefix %}{{ photo.url }}" alt="">

有关{% get_media_prefix %} HERE 的更多信息,请参阅文档。

【讨论】:

  • 仍然没有显示。我唯一能想到的是我把我的媒体目录放在了错误的地方?如果我的所有代码都在 src 文件夹内(例如,manage.py 就在该目录内)我的 media 文件夹可以在 src 文件夹之外吗?不过,我也尝试将其放入内部,但没有任何变化,所以我想这可能不是问题。
  • 如果您在 URL: .../media/media_root/... 上看不到任何图像,则问题出在配置(设置)中,或者您没有任何图像目录然后视图中的某些内容或 add_photos.html 是错误的。
【解决方案2】:

我的网址是问题所在。当它试图检索媒体文件时,它在匹配任何媒体 URL 之前匹配了url(r'^', profiles.views.home, name='home')。一个简单的$ 修复了它:

url(r'^$', profiles.views.home, name='home')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    相关资源
    最近更新 更多