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变量,已修正)
错误原因
- URL配置错误:使用
re_path将ts声明为URL路径参数(即my_view后直接拼接ts值),而非查询参数; - 模板传参错误:通过
{% 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
相关产品推荐
相关产品推荐

