Django NoReverseMatch错误解决及后台查看评分需求
解决NoReverseMatch错误 & 配置Admin查看评分
一、修复按钮跳转的NoReverseMatch错误
这个错误基本是URL路由名不匹配或者没传必要参数导致的,按你的场景一步步排查:
1. 核对URL路由配置
先确保你的app路由里给评分页面设置了带参数的命名路由,比如:
# 你的app/urls.py from django.urls import path from . import views urlpatterns = [ # 其他路由... path('ratings/<int:product_id>/', views.ratings_page, name='product_ratings'), ]
重点是name='product_ratings'这个命名,还有<int:product_id>用来接收商品ID参数。
2. 修正模板里的按钮链接
在商品列表模板中,“View Ratings”按钮的跳转要正确使用{% url %}标签,传对商品ID:
<!-- 商品项的模板代码 --> <a href="{% url 'product_ratings' product.id %}" class="btn">View Ratings</a>
注意:如果你的路由名不是product_ratings,要改成你实际定义的名称;同时确保模板里能拿到product对象,能获取到它的id。
3. 确保视图函数接收参数
处理评分页面的视图要能接收到product_id参数,比如:
# views.py from django.shortcuts import get_object_or_404, render from .models import Product def ratings_page(request, product_id): product = get_object_or_404(Product, id=product_id) # 这里添加你的评分查询、提交逻辑 return render(request, 'ratings.html', {'product': product})
二、配置Admin后台查看评分
假设你有Rating模型关联着Product(示例模型如下),按以下步骤配置:
1. 示例Rating模型(如果还没定义)
# models.py from django.db import models from django.contrib.auth.models import User class Product(models.Model): name = models.CharField(max_length=100) # 你的其他商品字段 class Rating(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='ratings') user = models.ForeignKey(User, on_delete=models.CASCADE) score = models.IntegerField(choices=[(1,'1星'),(2,'2星'),(3,'3星'),(4,'4星'),(5,'5星')]) comment = models.TextField(blank=True) created_at = models.DateTimeField(auto_now_add=True)
2. 注册模型到Admin
在admin.py里注册模型,同时优化显示效果:
# admin.py from django.contrib import admin from .models import Product, Rating # 内嵌评分到商品详情页 class RatingInline(admin.TabularInline): model = Rating extra = 0 # 不显示空白的评分表单 readonly_fields = ('user', 'created_at') # 用户和创建时间禁止修改 @admin.register(Product) class ProductAdmin(admin.ModelAdmin): inlines = [RatingInline] # 商品详情页下方显示关联的评分 list_display = ('name', 'avg_rating') # 商品列表页显示平均评分 def avg_rating(self, obj): # 计算平均评分 ratings = obj.ratings.all() if ratings: return round(sum(r.score for r in ratings)/len(ratings), 1) return '暂无评分' avg_rating.short_description = '平均评分' @admin.register(Rating) class RatingAdmin(admin.ModelAdmin): list_display = ('product', 'user', 'score', 'created_at') list_filter = ('score', 'created_at') search_fields = ('product__name', 'user__username')
3. 查看评分的方式
- 进入Admin的商品列表,点击任意商品,就能在页面下方看到该商品的所有评分;
- 直接进入“Ratings”模块,能看到所有评分的列表,还能按星级、时间筛选,按商品名/用户名搜索。
内容的提问来源于stack exchange,提问作者Sam McCormick
相关产品推荐
相关产品推荐

