python Django 重复 url 多次

python Django repeat url many times

我是 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/app/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/app/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/app/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/app/templates/app/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 %}

如果我运行pythonmanage.py运行服务器,然后去http://127.0.0.1:8000/poster/。我可以看到我之前创建的一个对象,当我单击它时,它指向的 url 会重复多次

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

您是否检查过 URL 在生成的 HTML 代码中的外观?例如。加载 HTML 时 URL 看起来正确吗?当您单击它时,它会开始重复吗?

首先我认为你在你的 models.py 线上缺少一个 forwardshals :

info_image = models.ImageField(upload_to='images/%Y%m/%d')

除非是你的本意,否则我认为应该是这样的:

info_image = models.ImageField(upload_to='images/%Y/%m/%d')
                                                   ^

接下来是您没有在 index.html 模板的 <a> 标签中为 href 属性提供正确的 url。

{{forloop.counter}}.<a href="{{ item.info_image.url }}/">{{ item.info_text }}</a>

此行将指向图像本身。因此,您可以在 <image src="{{ item.info_image.url }}" /> 中使用它的示例,但不能在 link 标记中使用它。所以我想这就是您要找的东西。

要指向特定图像的 detail 视图,您最好在 Info 模型 class.

上创建 get_absolute_url 方法

Model.get_absolute_url()

Define a get_absolute_url() method to tell Django how to calculate the canonical URL for an object. To callers, this method should appear to return a string that can be used to refer to the object over 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 }}" />