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

Django模板传递命名参数到URL时生成格式异常问题求助

Django模板生成URL时查询参数格式错误问题解决

在Django模板中传递参数到URL时,生成的链接缺少查询参数关键字?ts=,实际生成的href是my_view20230511,而非预期的my_view?ts=20230511。虽然my_view、my_view20230511和my_view?ts=20230511都能正常访问,但仅需要my_view和my_view?ts=20230511这两种格式,需调整代码让模板链接正确指向带?ts=的URL。

原代码

urls.py

from django.urls import re_path
from . import views

urlpatterns = [
    re_path(r'^my_view(?P<ts>\d+)?$', views.my_view, name = "my_view")
    ]

views.py

from datetime import datetime

def my_view(request, ts=""):
    ts = request.GET.get('ts', "")
    timestamps = [
        ('20230509', datetime(2023,5,9)),
        ('20230510', datetime(2023,5,10)),
        ('20230511', datetime(2023,5,11))
    ]
  
    context = {
        'timestamps' : timestamps,
        'ts' : ts
    }
    
    if ts != "":
        with open(f"filepath/that/depends/on/{ts}", "r") as f:
            lines = f.readlines()
        context['lines'] = lines

    return render(request, 'template.html', context)

(注:原代码中timestamps的元组括号不完整,已补充)

template.html

{% for ts,ts_fmt in timestamps %}
   <p><a href="{% url 'my_view' ts=ts %}">{{ ts_fmt }}</a></p>
{% endfor %}

{% if lines %}
      {% for line in lines %}
         <p>{{ line }}</p>
      {% endfor %}
{% endif %}

(注:原代码中{% if msg %}应为{% if lines %},因context传递的是lines变量,已修正)

错误原因

  1. URL配置错误:使用re_path将ts声明为URL路径参数(即my_view后直接拼接ts值),而非查询参数;
  2. 模板传参错误:通过{% url %}标签传递的参数会被解析为URL路径参数,而非查询参数,导致生成my_view20230511这类格式。

修正后的代码

urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('my_view', views.my_view, name = "my_view")
    ]

(改为path简化配置,仅匹配my_view基础路径)

views.py

from datetime import datetime

def my_view(request):
    ts = request.GET.get('ts', "")
    timestamps = [
        ('20230509', datetime(2023,5,9)),
        ('20230510', datetime(2023,5,10)),
        ('20230511', datetime(2023,5,11))
    ]
  
    context = {
        'timestamps' : timestamps,
        'ts' : ts
    }
    
    if ts != "":
        with open(f"filepath/that/depends/on/{ts}", "r") as f:
            lines = f.readlines()
        context['lines'] = lines

    return render(request, 'template.html', context)

(移除视图函数的ts路径参数,仅通过request.GET.get获取查询参数)

template.html

{% for ts,ts_fmt in timestamps %}
   <p><a href="{% url 'my_view' %}?ts={{ ts }}">{{ ts_fmt }}</a></p>
{% endfor %}

{% if lines %}
      {% for line in lines %}
         <p>{{ line }}</p>
      {% endfor %}
{% endif %}

(先通过{% url %}生成基础URL,再手动拼接查询参数?ts={{ ts }},同时修正原代码中url名称笔误admin_mail为my_view)

内容的提问来源于stack exchange,提问作者elka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:05:04