python Django多次重复url

时间:2016-08-10 14:43:37

标签: python django django-models django-urls

我是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 enter image description here

我相信url.py有问题,但我不确定。有人可以帮忙吗?

2 个答案:

答案 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方法。

  

Model.get_absolute_url()

     

定义一个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是否正确,当您单击它时,它会重复开始吗?