You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django视图无法识别模板传入的ru参数,过滤功能异常

问题描述

尝试从模板向视图传递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

from django.shortcuts import render
from django.utils import timezone
from django.views import generic
from django.core.paginator import Paginator
...

from .models import Clanek, Rubrika, Znacka, GalerieObrazku, Hlavni_banner
...

def clanek_vyber(request, zn, ru):
    bannery_1 = Hlavni_banner.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')[:1]

    clanek_znacka = Clanek.objects.values('znacka')
    znac = Znacka.objects.filter(id__in=clanek_znacka)
    rubr = Clanek.objects.distinct('rubrika').order_by('rubrika_id')

    if (zn!="" and ru!=""):
        uvodni_clanek = Clanek.objects.filter(znacka__slug=zn).filter(rubrika__slug=ru).order_by('-published_date')[:1]
        zna = Znacka.objects.get(slug=zn)
        rub = Rubrika.objects.get(slug=ru)
        cla_vyb = Clanek.objects.filter(znacka__slug=zn).filter(rubrika__slug=ru).order_by('-published_date')[1:]
        paginator = Paginator(cla_vyb, 20) # ukáže dvacet dalších článků
        page_number = request.GET.get("page")
        page_obj = paginator.get_page(page_number)
        context = {
            'bannery_1': bannery_1,
            'uvodni_clanek': uvodni_clanek,
            'page_obj': page_obj,
            'znac': znac,
            'zna': zna,
            'zn': zn,
            'rubr': rubr,
            'rub': rub,
            'ru': ru
            }
        return render(request, "zentour/clanky.html", context)

    if(zn!=""):
        uvodni_clanek = Clanek.objects.filter(znacka__slug=zn).order_by('-published_date')[:1]
        zna = Znacka.objects.get(slug=zn)
        cla_vyb = Clanek.objects.filter(znacka__slug=zn).order_by('-published_date')[1:]
        paginator = Paginator(cla_vyb, 20) # ukáže dvacet dalších článků
        page_number = request.GET.get("page")
        page_obj = paginator.get_page(page_number)
        context = {
            'bannery_1': bannery_1,
            'uvodni_clanek': uvodni_clanek,
            'page_obj': page_obj,
            'znac': znac,
            'zna': zna,
            'zn': zn,
            'rubr': rubr
            }
        return render(request, "zentour/clanky.html", context)

    elif(ru!=""):
        uvodni_clanek = Clanek.objects.filter(rubrika__slug=ru).order_by('-published_date')[:1]
        rub = Rubrika.objects.get(slug=ru)
        cla_vyb = Clanek.objects.filter(rubrika__slug=ru).order_by('-published_date')[1:]
        paginator = Paginator(cla_vyb, 20) # ukáže dvacet dalších článků
        page_number = request.GET.get("page")
        page_obj = paginator.get_page(page_number)
        context = {
            'bannery_1': bannery_1,
            'uvodni_clanek': uvodni_clanek,
            'page_obj': page_obj,
            'znac': znac,
            'rubr': rubr,
            'rub': rub,
            'ru': ru
            }
        return render(request, "zentour/clanky.html", context)

    else:
        uvodni_clanek = Clanek.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')[:1]
        dalsi_clanky = Clanek.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')[1:]
        paginator = Paginator(dalsi_clanky, 20) # ukáže dvacet dalších článků
        page_number = request.GET.get("page")
        page_obj = paginator.get_page(page_number)

        context = {
            'bannery_1': bannery_1,
            'uvodni_clanek': uvodni_clanek,
            'page_obj': page_obj,
            'znac': znac,
            'rubr': rubr
            }
    return render(request, "zentour/clanky.html", context)

单文章模板HTML

<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>

文章列表页下拉菜单模板(含JS)

<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实现过滤功能,能够正常生效,但更倾向于使用当前方案,卡在该问题上许久,未找到合适解决办法,请求帮助。

内容的提问来源于Stack Exchange,提问作者Pavel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:29:50