我是Django1.10的首发。我刚刚开始玩它。我想在网站上展示一个图片。
这是myproject / settings.py:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
和myproject / urls.py
from django.conf.urls import url, include
from django.contrib import admin
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
url(r'^poster/', include('poster.urls')),
url(r'^admin/', admin.site.urls ),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
myproject的/应用/ views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Info
# give a set of summary of items
def index(request):
latest_item_list = Info.objects.all()
context = {'latest_item_list': latest_item_list}
return render(request, 'poster/index.html', context)
def detail(request, item_id):
return HttpResponse("This function will return detail info for items %s" % item_id)
myproject的/应用/ models.py
from django.db import models
class Info(models.Model):
def __str__(self):
return self.info_text
info_text = models.CharField(max_length=50)
pub_date = models.DateTimeField('date published')
info_image = models.ImageField(upload_to='images/%Y%m/%d')
myproject的/应用/ urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# ex:/poster
url(r'^$', views.index, name='index'),
# ex: /poster/5
url(r'^(?P<item_id>[0-9]+)/$', views.detail, name = 'detail'),
]
myproject的/应用/模板/应用/ index.html中
{% if latest_item_list %}
<ul>
{% for item in latest_item_list %}
{{forloop.counter}}.<a href="{{ item.info_image.url }}/">{{ item.info_text }}</a>
{% endfor %}
</ul>
{% else %}
<p>No poster are available.</p>
{% endif %}
如果我运行python manage.py runserver,请转到http://127.0.0.1:8000/poster/。我可以看到我之前创建的一个对象,当我点击它时,它指向重复多次的URL
我相信url.py有问题,但我不确定。有人可以帮忙吗?
答案 0 :(得分:1)
首先,我认为你错过了models.py
在线的forwardshals:
info_image = models.ImageField(upload_to='images/%Y%m/%d')
除非是你的意图,否则我认为应该是这样的:
info_image = models.ImageField(upload_to='images/%Y/%m/%d')
^
接下来就是您没有在href
模板的<a>
标记中为index.html
属性提供正确的网址。
{{forloop.counter}}.<a href="{{ item.info_image.url }}/">{{ item.info_text }}</a>
此行将指向图像本身。因此,您可以在<image src="{{ item.info_image.url }}" />
中使用它,但不能在链接标记中使用它。所以我想这就是你要找的东西。
要指向特定图片的detail
视图,您需要在get_absolute_url
模型类上理想地创建Info
方法。
定义一个get_absolute_url()方法,告诉Django如何计算对象的规范URL。对于调用者,此方法应该返回一个字符串,该字符串可用于通过HTTP引用该对象。
例如:
# models.py
class Info(models.Model):
...
info_image = models.ImageField(upload_to='images/%Y%m/%d')
def get_absolute_url(self):
return reverse('detail',
args=[self.id])
然后您可以在模板中使用它:
{{forloop.counter}}.<a href="{{ item.get_absolute_url }}">{{ item.info_text }}</a>
并使用以下任意方式显示您的图片:
<image src="{{ item.info_image.url }}" />
答案 1 :(得分:0)
您是否检查了URL在生成的HTML代码中的外观?例如。加载HTML时URL是否正确,当您单击它时,它会重复开始吗?