#django #django-urls
Вопрос:
Мне трудно понять, почему страницы тегов для моего блога пытаются перейти на другой вид, чем тот, который я намереваюсь. Мой /тег/ URL-адрес должен перейти в TagsListView, но вместо этого будет отправлен в PostDetail.
Моя структура URL-адресов:
app_name = 'blog'
urlpatterns = [
path('', views.home, name='home'),
path('search/', SearchResultsView.as_view(), name='search_results'),
path('tag/<slug:slug>', views.TagsListView.as_view(), name='blog_tag'),
path('<slug:slug>/', views.CategoriesDetail.as_view(), name='categories_detail'),
path('<slug:categories_detail>/<slug:slug>/', views.PostDetail.as_view(), name='post_detail'),
path('<slug:categories_detail>/<slug:slug>/comment',
views.CommentCreateView.as_view(), name='post_comment_create'),
]
Вид:
class TagsListView(ListView):
model = Tag
template_name = 'blog/tags.html'
Шаблон (реализация должна быть динамичной):
<a href="/tag/{{ tag.slug }}"><h4><span class="badge badge-primary">{{ tag }}</span></h4></a>
По какой-то причине URL-адрес, domain.com/tag/tagname попытается сопоставить и запустить представление PostDetail и 404 вместо представления списка тегов. Кажется, все должно совпадать, поэтому я не уверен, почему он пропускает это.
Кроме того, я считаю, что мне следует настроить модель для представления списка тегов на публикацию (сообщения в блоге) и создать пользовательский набор запросов, который фильтрует на основе слага для запрошенного тега. Правильно? Или все наоборот? Я еще не дошел до этого момента, чтобы протестировать его, и задаюсь вопросом, как лучше всего подойти к этому.
Спасибо.
Комментарии:
1. Разве ваш href не должен быть
/tag/{{ tag.slug }}
?2.
<a href="{% url 'blog_tag' tag.slug %}"
>…></a>3. @Rvector, к сожалению, это приводит к той же ошибке. Он все еще пытается запустить PostDetail, а не TagListView. глдев — да. Я допустил ошибку, скопировав код, но исправил свой первоначальный пост.
4. Поставьте
post_detail
путь к URL-адресу передblog_tag
URL-адресом.5. Оказывается, я забыл переднюю косую черту после <slug:slug>/. Теперь он работает правильно. Глупая ошибка.