Представление Django не распознает имя параметра из шаблона
Я пытаюсь передать два параметра из шаблона ("zn" и "ru") для фильтрации постов в просмотре. Мне кажется, что переменные обоих параметров в порядке, но не под правильным именем. Вероятно, представление не распознает, кто из них кто. Фильтрация с параметром "zn" работает, а фильтрация с параметром "ru" - нет (см. сообщение об ошибке на картинке). введите описание изображения здесь
urls.py:
from django.urls import path
from . import views
urlpatterns = [
...
path("clanky/", views.clanek_vyber, name="clanky_vyber", kwargs={'zn': '', 'ru': ''}),
path("clanky/<slug:zn>/", views.clanek_vyber, name="clanky_vyber", kwargs={'ru': ''}),
path("clanky/<slug:ru>/", views.clanek_vyber, name="clanky_vyber", kwargs={'zn': ''}),
path("clanky/<slug:zn>/<slug:ru>/", views.clanek_vyber, name="clanky_vyber"),
views.py:
html, single post:
<div class="odkazy_pod_clanky">
<small>
Značka:
{% for z in clanek.znacka.all %}
<a href="{% url 'clanky_vyber' zn=z.slug ru='' %}">{{ z }}, </a>
{% endfor %}
Rubrika: <a href="{% url 'clanky_vyber' zn='' ru=clanek.rubrika.slug %}">{{ clanek.rubrika }}</a>
<!-- Zařazení: {{ clanek.urceni.all|join:", "}} -->
</small> <br>
</div>
html, выпадающие окна (javascript) на странице со списком постов:
<div class="rozbalovaci_znacka">
<button onclick="rozbal_znacka()" class="menu_znacka">značka: {{ zna }}</button>
<div id="rozbalovacka_znacka" class="polozky_k_rozbaleni_znacka">
<a href="{% url 'clanky_vyber' zn="" %}">jakákoliv</a>
{% for za in znac %}
<a href="{% url 'clanky_vyber' zn=za.slug %}">{{ za.nazev_znacky }}</a>
{% endfor %}
</div>
</div>
<!-- třídění dle rubriky-->
<div class="rozbalovaci_rubrika">
<button onclick="rozbal_rubrika()" class="menu_rubrika">rubrika: {{ rub }}</button>
<div id="rozbalovacka_rubrika" class="polozky_k_rozbaleni_rubrika">
<a href="{% url 'clanky_vyber' ru="" %}">jakákoliv</a>
{% for rb in rubr %}
<a href="{% url 'clanky_vyber' ru=rb.rubrika.slug %}">{{ rb.rubrika }}</a>
{% endfor %}
</div>
</div>
Я также пробовал фильтровать сообщения с помощью django-filters и это сработало, но я бы предпочел решение выше. Я уже давно в этом разбираюсь и не смог найти правильного решения в существующих вопросах на этом сайте. Спасибо, Павел
Пути полностью пересекаются. Действительно:
path("clanky/<slug:zn>/", views.clanek_vyber, name="clanky_vyber", kwargs={'ru': ''}),
path("clanky/<slug:ru>/", views.clanek_vyber, name="clanky_vyber", kwargs={'zn': ''}),
если путь clanky/foo
, то оба пути совпадают. Таким образом, он будет проверять пути в определенном порядке и всегда выбирать первый, поэтому при zn
в качестве значения и ru
пустой.
Таким образом, вы должны убедиться, что пути не пересекаются. Возможно, лучше, чтобы они не перекрывались полностью:
urlpatterns = [
path(
'clanky/zn/<slug:zn>/',
views.clanek_vyber,
name='clanky_vyber',
kwargs={'ru': ''},
),
path(
'clanky/ru/<slug:ru>/',
views.clanek_vyber,
name='clanky_vyber',
kwargs={'zn': ''},
),
path(
'clanky/znru/<slug:zn>/<slug:ru>/',
views.clanek_vyber,
name='clanky_vyber',
),
]