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

如何为2个及以上slug参数编写Django的{% url %}模板标签?

解决Django多Slug参数的URL反转问题

你遇到的错误核心是URL反转时参数传递错误,同时视图、模型里还有几处细节问题需要修正,以下是分步解决方案:


1. 修复模板中的URL反转语法

模板里的{% url %}标签完全用错了:第一个参数必须是URL的命名空间+名称,后续按URL定义的参数顺序传值。你的mahallaURL需要tuman_slug和mahalla_slug两个参数,要传递tuman_url的slug值,不是对象本身。

修改后的HTML代码:

{% for i in mahalla %}
{% if i.tum == tuman_url %}
<tr>
    <td style="font-weight: bold;"><a href="{% url 'iib:mahalla' tuman_url.slug i.slug %}" style="text-decoration:none; color:black;">{{ i.name }}</a></td>
</tr>
{% endif %}
{% endfor %}

2. 修复视图函数的两处错误

2.1 完善show_one_stata的Mahalla查询

原代码里mahalla = Mahalla.objects.未完成查询,直接过滤当前tuman下的mahalla可以简化模板逻辑:

def show_one_stata(request, tuman_slug: str):
    tuman_url = get_object_or_404(Tuman, slug=tuman_slug)
    tuman_list = Tuman.objects.all()
    citizen = Citizen.objects.all()
    category = Category.objects.all()
    # 直接过滤当前tuman下的mahalla,避免模板中重复判断
    mahalla = Mahalla.objects.filter(tum=tuman_url)

    context = {
        'citizen': citizen,
        'category': category,
        'mahalla': mahalla,
        'tuman': tuman_list,
        'tuman_url': tuman_url,
    }
    return render(request, 'main/one_stata.html', context)

2.2 修复show_one_mahalla的参数顺序与查询错误

URL定义中参数顺序是tuman_slug在前、mahalla_slug在后,视图参数必须对应;同时获取Tuman对象时误用了mahalla_slug,要改成tuman_slug:

def show_one_mahalla(request, tuman_slug: str, mahalla_slug: str):
    citizen = Citizen.objects.all()
    nizo = Category.objects.all()
    # 关联tuman_slug查询,避免mahalla跨tuman重复
    mahalla_for = get_object_or_404(Mahalla, slug=mahalla_slug, tum__slug=tuman_slug)
    tuman_url = get_object_or_404(Tuman, slug=tuman_slug)

    context = {
        'citizen': citizen,
        'nizo': nizo,
        'mahalla_for': mahalla_for,
        'tuman_url': tuman_url,
    }
    return render(request, 'main/one_mahalla.html', context)

3. 修复模型的get_absolute_url方法

模型中get_absolute_url用了主键pk,但URL配置里用的是slug,必须改成传递slug参数:

Tuman模型

def get_absolute_url(self):
    return reverse('iib:tuman_stata', kwargs={'tuman_slug': self.slug})

Mahalla模型

def get_absolute_url(self):
    return reverse('iib:mahalla', kwargs={'tuman_slug': self.tum.slug, 'mahalla_slug': self.slug})

4. 优化URL配置(可选)

确保urls.py中的路径用原生尖括号<(不是转义后的&lt;),并添加末尾斜杠符合Django规范:

path('statistika/<slug:tuman_slug>/', show_one_stata, name='tuman_stata'),
path('<slug:tuman_slug>/mahalla/<slug:mahalla_slug>/', show_one_mahalla, name='mahalla'),

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:55:49