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 переменная содержит данные? Если у вас нет результатов, результат будет таким же, как в представлении индекса.

Другие вопросы по тегам