django - urls.py根路径集

时间:2016-01-04 08:14:41

标签: python django django-urls

当我输入localhost:8000localhost:8000/store时,两个视图都与home/index.html相同。 我希望这些路径设置不同的视图。

urls.py

from django.conf.urls import url
from django.contrib import admin

urlpatterns = [
    url(r'', 'home.views.index', name='view_home'),
    url(r'^admin/', admin.site.urls),
    url(r'^store/$', 'store.views.store_list', name='view_store_list'),
    url(r'^store/(?P<store_id>\d+)$', 'store.views.single_store')
]

views.py - home

from django.shortcuts import render

def index(request):
    return render(
        request,
        'index.html'
    )

views.py - store

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse

from .models import Store # fetch Store model

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger # paginate
def store_list(request):
    store_list = Store.objects.all()
    paginator = Paginator(store_list, 2)

    page = request.GET.get('page')
    try:
        stores = paginator.page(page)
    except PageNotAnInteger:
        stores = paginator.page(1)
    except EmptyPage:
        stores = paginator.page(paginator.num_pages)

    return render(
        request,
        'index.html',
        {
            'stores': stores,
        }
    )

喝彩!

编辑:

我也试过了url(r'^$', 'home.views.index', name='view_home'),,但结果却相同。

4 个答案:

答案 0 :(得分:3)

您需要锚定并终止根视图的模式:

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

答案 1 :(得分:2)

我认为您的模板名称相互冲突。您可以像这样为整个项目制作一个模板文件夹

Project
   |>Templates
   |>store
   |>home

在模板中,您可以像这样放置模板

 Project
   |>Templates
        store
            |>index.html
        home
            |>index.html
   |store
   |home

现在您可以像这样给出模板的路径

def index(request):
return render(
    request,
    'home/index.html'
)

如果您想将模板保留在您应用下的目录中,那么this问题可能对您有所帮助。

答案 2 :(得分:0)

中有一个斜杠'/'
url(r'^store/$', 'store.views.store_list', name='view_store_list')

因此它对网址localhost:8000/store/有效,但对网址localhost:8000/store无效。所以你需要删除尾部斜杠。

另外@Daniel是对的,你需要像他在回答中提到的那样放置主页URL。尾部斜杠是更改主页URL后无法使其工作的原因。

答案 3 :(得分:0)

Daniel提到的第一个问题是url模式,如果只设置空字符串,它将始终匹配。因此,您应该使用url(r'^$', 'home.views.index', name='view_home')。使用r'^$',您说模式仅与空字符串匹配。或者,您可以在列表末尾移动此URL,如果其他任何内容匹配,它将用作默认视图。

我看到的第二个问题是,在store_list视图中,您将返回:

return render(
    request,
    'index.html',
    {
        'stores': stores,
    }
) 

您是否对索引和存储使用相同的模板index.html,还是只是复制和粘贴错误?如果是这样,您确定stores变量包含数据吗?如果您没有任何结果,结果将与索引视图相同。