Django: Реверс для 'add_review' с аргументами '('',)' не найден. 1 pattern(s) tried: ['movies/addreview/(?P<id>[0-9]+)/\\\Z'].

Я хочу добавить функцию рецензирования в movie_detail.html, но не знаю, как запросить комментарии и отобразить их в movie_detail.It returns Reverse for 'add_review' with arguments '('',)' not found error.

Мой url.py:

urlpatterns = [
    path('', MovieList.as_view(), name='movie_list'),
    path('<int:pk>', MovieDetail.as_view(), name='movie_detail'),
    path('search/', MovieSearch.as_view(), name='movie_search'),
    path('addreview/<int:id>/', views.add_review, name='add_review'),
]

Мой model.py:

class Movie(models.Model):
    title = models.CharField(max_length=200)
    actors = models.CharField(max_length=500, null=True)
    poster_url = models.CharField(max_length=200)
    director = models.CharField(max_length=200, default='')
    score = models.FloatField()
    genres = models.CharField(max_length=200)
    language = models.CharField(max_length=200, default='English')
    durations = models.IntegerField(default=0)
    regions = models.CharField(max_length=200, default='')
    release_date = models.DateField(default=timezone.now)
    description = models.TextField(max_length=1000, default='')
    year = models.IntegerField(default=2000)
    views_count = models.IntegerField(default=0)
    created = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

    def genres_as_list(self):
        genre_list = self.genres.split('/')
        return genre_list

    def actors_as_list(self):
        return self.actors.split('/')


class Review(models.Model):
    movie = models.ForeignKey(Movie, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    comments = models.TextField(max_length=1000)
    rating = models.FloatField(default=0)
    data_added = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.user.username

my view.py:

class MovieDetail(DetailView):
    model = Movie
    template_name = "main/movie_detail.html"

    def get_object(self):
        object = super().get_object()
        object.views_count += 1
        object.save()
        return object

    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(id=self.kwargs['pk'])
        return context


class MovieSearch(ListView):
    model = Movie
    paginate_by = 20
    template_name = "main/movie_list.html"

    def get_queryset(self):
        query = self.request.GET.get('query')
        if query:
            object_list = self.model.objects.filter(title__icontains=query)
        else:
            object_list = self.model.objects.none()
        return object_list


@login_required
def add_review(request, id):
    movie = Movie.objects.get(id=id)
    if request.method != "POST":
        form = ReviewForm(request.POST or None)
        if form.is_valid():
            data = form.save(commit=False)
            data.comment = request.POST["comment"]
            data.rating = request.POST["rating"]
            data.user_id = request.user.pk
            data.movie_id = movie.pk
            data.save()
            return redirect("main:movie_detail", id)
    else:
        form = ReviewForm()

    context = {"form": form}
    return render(request, 'main/movie_detail.html', context)

моя movies_detail.html часть рецензии:

            <section class="comments">
                <h3>Comment</h3>
                    <div class="card">
                        <div class="card-body">
                            <h3 class="text-center">Add Review</h3>
                            <form method="POST" action="{% url 'main:add_review' movie.id%}">
                                {% csrf_token %}
                                <label for="comment">Review</label>
                                <textarea name="comment" id="comment" cols="30" rows="5" class="form-control"></textarea>

                                <label for="rating">Rating</label>
                                <input type="text" name="rating" class="form-control">

                                <br>
                                <input type="submit" class="btn btn-danger" value="Add Review">
                            </form>
                        </div>
                    </div>

Я хочу добавить функцию обзора и я закодировал add_review в view.py по какому-то учебнику. Но я не знаю, как это исправить.

Примечание

  • Когда вы хотите разместить данные в представлении, которое оно рендерит, вам не нужно указывать действие, а оставить как action=""
  • .

Вы не передаете объект movie в шаблон, поэтому movie.id оценивается как пустая строка, что вызывает исключение, которое вы наблюдаете.

Попробуйте это:

@login_required
def add_review(request, id):
    movie = Movie.objects.get(id=id)
    ...
    context = {"form": form, "movie": movie}
    return render(request, 'main/movie_detail.html', context)

Редактирование: альтернативно, вы можете просто установить action="", как указал Шах Савуд в своем ответе.

На заметку: Добро пожаловать на Stack Overflow! В следующий раз, пожалуйста, публикуйте полный стектрейс, это увеличит ваши шансы получить ответ на вашу проблему :)

Вы получаете ошибку, потому что не передаете фильм в контекст в последних 2 строках add_review. Вам нужно обновить его до

context = {"form": form, "movie": movie}
return render(request, 'main/movie_detail.html', context)
Вернуться на верх