@DmitryRise

Как освоить магию url в Django?

Приветствую, недавно начал окунаться в back-end и начал с Django (потыкался по учебникам, дело пошло, но появилась загвоздка и понять "почему оно не работает?!" не представляется на данный момент возможным.

Я создаю представление для страниц и указываю их в контроллере.

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

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})


urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('blog.urls')),
    url(r'^post_list/', include('blog.urls')),
]


urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^$', views.post_list, name='post_list'),

]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += staticfiles_urlpatterns()

if settings.DEBUG:
    urlpatterns += [
        url(r'^images/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
    ]


Вставляю в шаблон ссылку

{% url "post_list" %}

При нажатии на ссылку url в адресной строке меняется, но шаблон index остается на своём месте. Подскажите, пожалуйста, в чем проблема?
  • Вопрос задан
  • 515 просмотров
Решения вопроса 2
@AlexandrBirukov
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('blog.urls')),
    url(r'^post_list/', include('blog.urls')),
]

вот тут url(r'^post_list/', include('blog.urls')) убираем, смысла подключать два раза одно и тоже нет

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^$', views.post_list, name='post_list'),
]

а тут второй урл делаем уникальным, вообще ищется первое совпадение, остальные игнорятся
Ответ написан
Получив запрос на ссылку /post_list/, url matcher проходит по всем шаблонам в urls.py по очереди. Первй, который подходит - это:

url(r'', include('blog.urls')),

Поскольку регулярное выражение пустое, то Django берёт весь ваш URL и начинает искать его в blogs.urls, находя:

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

Вам нужно как минимум ссылку на index убрать из blogs/urls.py в projectname/urls.py.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы