Django影评功能开发报错:Reverse for 'add_review'参数为空未找到匹配路由,及影评查询与详情页映射实现问题求助
解决影评功能的两个问题:URL反向解析错误与影评数据展示
先处理你遇到的URL反向解析错误:
Reverse for 'add_review' with arguments '('',)' not found. 1 pattern(s) tried: ['movies/addreview/(?P<id>[0-9]+)/\\Z']
这个错误的核心原因是模板里的movie.id没有获取到有效值——你的MovieDetail视图默认把电影对象放在object这个context变量里,而非movie。有两种解决方式:
方法1:修改模板变量名
把表单的action属性改成:
<form method="POST" action="{% url 'main:add_review' object.id%}">
方法2:在视图中指定context变量名
在MovieDetail类里新增context_object_name属性,这样模板里就能直接用movie变量:
class MovieDetail(DetailView): model = Movie template_name = "main/movie_detail.html" context_object_name = 'movie' # 新增此行 # 其余代码保持不变
另外,你的add_review视图函数存在逻辑错误:请求方法的判断写反了,导致POST提交时初始化空表单,GET请求反而尝试处理提交。修正后的代码如下:
@login_required def add_review(request, id): movie = Movie.objects.get(id=id) if request.method == "POST": # 修正判断条件 form = ReviewForm(request.POST) if form.is_valid(): data = form.save(commit=False) data.comments = request.POST["comment"] # 注意模型字段是comments,不是comment data.rating = request.POST["rating"] data.user = request.user # 直接赋值用户对象,无需手动传pk data.movie = movie # 直接赋值电影对象,无需手动传pk data.save() return redirect("main:movie_detail", id) else: form = ReviewForm() context = {"form": form, "movie": movie} # 传递movie变量到模板,避免再次出现URL解析错误 return render(request, 'main/movie_detail.html', context)
接下来处理影评数据查询与详情页映射的问题:
你需要在MovieDetail的get_context_data方法中,查询当前电影对应的所有影评并传递给模板。取消你注释的代码并修正查询条件:
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['links'] = MovieLinks.objects.filter(movie=self.get_object()) context['related_movies'] = Movie.objects.filter(genres__in=self.get_object().genres_as_list()).order_by( 'created')[0:6] # 新增:查询当前电影的所有影评,按发布时间倒序排列 context['reviews'] = Review.objects.filter(movie=self.get_object()).order_by('-data_added') return context
然后在movie_detail.html中添加影评展示区域(推荐放在评论表单下方):
<!-- 展示已有影评 --> <div class="mt-4"> <h3>All Reviews</h3> {% if reviews %} {% for review in reviews %} <div class="card mb-3"> <div class="card-body"> <h5 class="card-title">{{ review.user.username }}</h5> <p class="card-text">Rating: {{ review.rating }}/5</p> <p class="card-text">{{ review.comments }}</p> <p class="card-text"><small class="text-muted">Posted on {{ review.data_added|date:"F j, Y, g:i a" }}</small></p> </div> </div> {% endfor %} {% else %} <p>No reviews yet. Be the first to review this movie!</p> {% endif %} </div>
最后,确保你已经定义了ReviewForm表单类(如果还没写,在forms.py中添加):
from django import forms from .models import Review class ReviewForm(forms.ModelForm): class Meta: model = Review fields = ['comments', 'rating']
这样就能完整实现影评的添加和展示功能了!
内容的提问来源于stack exchange,提问作者Jamstack
相关产品推荐
相关产品推荐

