django - набор корневых путей urls.py
Когда я вхожу localhost:8000
или же localhost: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 - магазин
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 ответа
Я думаю, как имя вашего шаблона противоречит друг другу. Вы можете сделать одну папку шаблонов для всего вашего проекта, как это
Project
|>Templates
|>store
|>home
В шаблонах вы можете поместить свои шаблоны так
Project
|>Templates
store
|>index.html
home
|>index.html
|store
|home
Теперь вы можете указать путь к шаблону следующим образом
def index(request):
return render(
request,
'home/index.html'
)
Если вы хотите сохранить шаблоны в каталоге под вашим приложением, то эта проблема может вам помочь.
Вам нужно привязать и завершить шаблон для корневого представления:
url(r'^$', 'home.views.index', name='view_home'),
У вас есть косая черта в /
url(r'^store/$', 'store.views.store_list', name='view_store_list')
так что это будет действительно для URL localhost:8000/store/
но не для URL localhost:8000/store
, Так что вам нужно удалить косую черту.
Плюс @Daniel прав, вам нужно указать домашний URL, как он упомянул в своем ответе. Конечная косая черта - это причина, по которой вы не можете заставить ее работать после изменения домашнего URL.
Первая проблема, как упомянул Дэниел, это шаблон URL, если вы просто установите пустую строку, она всегда будет соответствовать. Поэтому вы должны использовать url(r'^$', 'home.views.index', name='view_home')
, С r'^$'
Вы говорите, что шаблон соответствует только пустой строке. В качестве альтернативы вы можете переместить этот URL в конец списка, и он будет использоваться в качестве представления по умолчанию, если что-то еще совпадает.
Вторая проблема, которую я вижу, заключается в том, что в вашем store_list
просмотр вы возвращаете:
return render(
request,
'index.html',
{
'stores': stores,
}
)
Вы используете тот же шаблон, index.html
, как для индекса, так и для хранилища, или это просто ошибка копирования и вставки? Если это так, вы уверены, что stores
переменная содержит данные? Если у вас нет результатов, результат будет таким же, как в представлении индекса.