如何为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中的路径用原生尖括号<(不是转义后的<),并添加末尾斜杠符合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
相关产品推荐
相关产品推荐

