Django странно ведет себя с url, содержащими slug и /
Я сталкиваюсь со странным поведением django, которое я не вижу, где оно может пойти не так.
У меня есть начало приложения, которое возвращает динамические страницы, чьи url создаются через slug.
Все работает хорошо. С любым слизнем, который я пробую, все работает отлично, и урлы находят свой путь без проблем. Все они проходят по одному и тому же пути.
Но есть ТОЛЬКО один слиг, который не находит путь.
Особенность поведения заключается в том, что в url браузера это единственный <a href>
, который добавляет /
к url, хотя в html-коде у него нет /
в href.
Я не понимаю, когда добавляется /
, поскольку все страницы генерируются динамически и проходят через один и тот же процесс.
Это страница, отправляемая в браузер со всеми ссылками. Урл формируется динамно со слигом модели каждого поста.
<h2><a href="/posts/first-post"> my post first </a></h2>
<h2><a href="/posts/fourth-post"> my 4th post </a></h2>
<h2><a href="/posts/ready-for-summer"> Ready for Summer Fun! </a></h2>
<h2><a href="/posts/third-post"> my 3th post </a></h2>
При нажатии на каждую ссылку все проходит нормально и страница с постом отправляется. url в браузере после клика такой:
http://localhost:8000/posts/first-post/
<<<<<<--------- /
показывается
http://localhost:8000/posts/fourth-post
http://localhost:8000/posts/ready-for-summer
http://localhost:8000/posts/third-post
Как вы можете видеть, /
в конце url отображается только first-post/
.
Я не понимаю, почему это происходит.
Я пробовал разные slug'ы для одного и того же 'post' и во всех случаях находил, что /
не добавляется в конце, и страница отправляется без проблем. И только когда я использую слизень 'first-post', /
добавляется.
html где <a href>
генерируется:
{% block content %}
<section>
<h1>Post List</h1>
{% for post in posts %}
<article class='post'>
<h2><a href="{% url 'posts:page' slug=post.slug %}"> {{ post.title }} </a></h2>
<p>{{ post.date }}</p>
<p>{{ post.body }}</p>
</article>
{% endfor %}
</section>
{% endblock %}
urls.py приложения
app_name= 'posts' #defina namespace
urlpatterns = [
path('', views.posts_list, name='posts_list'),
path('<slug:slug>', views.post_page, name='page'),
]
views.py из приложения:
def post_page(request, slug):
try:
post = Post.objects.get(slug=slug)
print('TEST Post found:', post)
except Post.DoesNotExist:
print('TEST Post not found')
return HttpResponse('Post not found', status=404)
return render(request, 'posts/post_page.html', {'post': post})
запрос из оболочки, в котором вы можете увидеть слизняк 'first-post':
>>> from post.models import Post
>>> post = Post.objects.get(slug='first-post')
>>> print(f"'{post.slug}'")
'first-post
Странно то, что все 'post' проходят через один и тот же процесс, и все slugs работают нормально, ТОЛЬКО 'first-post' не работает.
Я не знаю, является ли проблема в браузере, когда добавляет /
только к
http://localhost:8000/posts/first-post/
.
Я все проверил.
Я могу решить проблему, добавив /
в путь <slug:slug>/
,
path('<slug:slug>/', views.post_page, name='page')
Но это не решает проблему, а лишь меняет способ обращения к пути. Но это изменение заставляет браузерный url иметь /
за ресурсом html, чего я не хочу.
Тогда вопрос в том, почему /
добавляется так произвольно только при 'first-post'.
Я перепробовал все, что знал.