【问题标题】:django - urls.py root path setdjango - urls.py 根路径集
【发布时间】:2024-05-22 05:35:02
【问题描述】:

当我输入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 - 主页

from django.shortcuts import render

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

views.py - 存储

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'),,但结果相同。

【问题讨论】:

  • 能否贴出相关视图代码?
  • 为什么你对两个不同的视图使用相同的模板index.html
  • 不一样吗?这些模板彼此具有不同的路径。 home/templates/index.htmlstore/templates/index.html
  • "这些模板有不同的路径。home/templates/index.html 和 store/templates/index.html" 是 home 和 store 是你的应用程序的名称?
  • @mhassan 是的!这些是我同一个项目中的应用程序名称

标签: python django django-urls


【解决方案1】:

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

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

【讨论】:

    【解决方案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 问题可能会对您有所帮助。

    【讨论】:

      【解决方案3】:

      你有一个尾部斜杠“/”

      url(r'^store/$', 'store.views.store_list', name='view_store_list')
      

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

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】: