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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 16:52:42