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

Django电商网站开发:URL路径与视图关联问题求助

电商网站Django开发:URL与视图关联问题解决

我在使用Django开发电商网站时,遇到了URL路径与视图关联的问题,无法正常显示网页。以下是相关代码及问题分析:

URL配置代码

from django.urls import path
from . import views

urlpatterns = [
    path('search/', views.search, name='search'),
    path('<slug:slug>/', views.category_detail, name='category_detail'),
    path('<slug:category_slug>/<slug:slug>/', views.product_detail, name='product detail'),
]

视图代码

from django.db.models import Q
from django.shortcuts import render, get_object_or_404
from .models import Category, Product

def category_detail(request, slug):
    category = get_object_or_404(Category, slug=slug)
    products = category.products.all()

    return render(request, 'store/category_detail.html', {
        'category': category,
        'products': products,
    })

模型代码

from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    title = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50)

    class Meta:
        verbose_name_plural = 'Categories'

    def __str__(self):
        return self.title

class Product(models.Model):
    user = models.ForeignKey(User, related_name='products', on_delete=models.CASCADE)
    Category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50)
    description = models.TextField(blank=True)
    price = models.IntegerField()
    image = models.ImageField(upload_to='uploads/product_images/', blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ('-created_at',)

    def __str__(self):
        return self.title

    def get_display_price(self):
        return self.price / 100

问题分析与解决方案

1. URL匹配顺序错误

Django的URL按从上到下的顺序匹配,当前配置中更宽泛的<slug:slug>/路径会先于商品详情URL匹配,导致商品详情请求被错误路由到分类视图,引发数据错误或404。

修正: 将更具体的商品详情URL放在分类URL前面:

urlpatterns = [
    path('search/', views.search, name='search'),
    path('<slug:category_slug>/<slug:slug>/', views.product_detail, name='product_detail'),
    path('<slug:slug>/', views.category_detail, name='category_detail'),
]

2. 模型字段命名错误

Product模型中的外键字段用了大写Category,与模型类名冲突,导致反向关联category.products.all()无法正确识别关系。

修正: 将字段名改为小写category(符合Django命名惯例):

class Product(models.Model):
    user = models.ForeignKey(User, related_name='products', on_delete=models.CASCADE)
    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)
    # 其余字段保持不变

3. URL名称含空格

product detail的name属性带空格,会导致reverse()反转URL时出错。

修正: 将名称改为无空格的蛇形命名product_detail(已包含在上面的URL配置中)。

完成以上修改后,URL与视图的关联即可正常工作,网页能正确显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:57:19