我们正在Django上建立我们的学校网站,我们制作了一个画廊应用程序,但我认为图像没有上传到指定文件夹,而是他们甚至没有上传我认为如此。 代码: -
# views.py
def upload(request, template_name="gallery/form.html"):
form = GalleryForm(request.POST or None, request.FILES or None)
if form.is_valid():
form.save()
messages.success(request, "image has been uploaded")
return redirect('gallery.views.index')
return render(request, template_name,{'form':form})
from django.db import models
# models.py
class GalleryPhoto(models.Model):
image = models.ImageField(upload_to='pic_folder/')
description = models.CharField(max_length=50)
def __unicode__(self):
return self.image.url
其余代码可在此repo中看到 注意:图库模板包含一些冲突,但这不是实际问题。
答案 0 :(得分:2)
我花了一段时间才注意到它,因为它有点棘手。但回想起来,这是显而易见的。
所以在配置MEDIA_URL = "/MEDIA/"
之后,我注意到http://127.0.0.1:8000/media/
给了我一个404.如果一切都配置正确(并且是),那么通常问题就是网址冲突。请参阅django中使用的url模式,始终按顺序进行评估。这意味着如果你有这样的网址:
url(r'^mypage/', 'myapp.mypage'),
url(r'^mypage/another/', 'myapp.different')
然后第二个网址永远不可用。为什么?因为没有任何内容告诉网址调度员第一个网址应该在mypage/
结束。就其而言,以http://DOMAIN/mypage/
开头的所有内容都将被捕获并传递给第一个函数。
为避免这种情况,我们使用$
符号告诉调度员停止的位置。像这样:
url(r'^mypage/$', 'myapp.mypage'),
url(r'^mypage/another/$', 'myapp.different')
现在让我们看看你的最后两个网址:
url(r'^', include('pages.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
看到了吗? url(r'^'
吞下了之后的所有内容,因此没有媒体服务。 pages.urls
确实使用了第一个网址的美元:
url(r'^$', views.index, name='index'),
但主要的url调度程序无关紧要,它首先评估r'^'
。解决方案是什么?最简单的方法是将pages
网址移到最后:
url(r'^ckeditor/', include('ckeditor.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += patterns('', url(r'^', include('pages.urls')))
您还可以使用直接调用将其中一个有问题的网址与其他网址隔离开来,如下所示:
url(r'^/$', 'pages.views.index'),
url(r'^pages/$', include('pages.urls')),
之后,这将有效:
<img src="{{ MEDIA_URL }}{{ image.image.url }}" alt="{{ image.description }}">
<强> P.S。强>
最终,当您转移到部署级别时,您将通过服务器传递媒体和静态文件,因此可能整件事情无关紧要。如果你决定继续使用r'^'
,请记住它可能会导致与其他网址冲突的问题,所以一定要把它放在最后。