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)