Наличие дополнительных url под <slug:slug> django
Я пытаюсь добавить еще одну html-страницу поверх url slug:slug, и она выдает ошибку... Я понятия не имею, что здесь пошло не так.
Уже перепробовал все, что мог придумать, и уже на грани того, чтобы сдаться, может ли кто-нибудь здесь помочь? :)
Сообщение об ошибке :
TypeError at /movies/joker/new/
add_comment() got an unexpected keyword argument 'slug'
Request Method: GET
Request URL: http://127.0.0.1:8000/movies/joker/new/
Django Version: 4.0.4
Exception Type: TypeError
Exception Value:
add_comment() got an unexpected keyword argument 'slug'
Exception Location: C:\Users\zenmy\PycharmProjects\pythonProject\venv\lib\site-packages\django\contrib\auth\decorators.py, line 23, in _wrapped_view
Python Executable: C:\Users\zenmy\PycharmProjects\pythonProject\venv\Scripts\python.exe
Python Version: 3.8.0
Python Path:
['C:\\Users\\zenmy\\PycharmProjects\\pythonProject\\Django-IMDB',
'C:\\Users\\zenmy\\AppData\\Local\\Programs\\Python\\Python38\\python38.zip',
'C:\\Users\\zenmy\\AppData\\Local\\Programs\\Python\\Python38\\DLLs',
'C:\\Users\\zenmy\\AppData\\Local\\Programs\\Python\\Python38\\lib',
'C:\\Users\\zenmy\\AppData\\Local\\Programs\\Python\\Python38',
'C:\\Users\\zenmy\\PycharmProjects\\pythonProject\\venv',
'C:\\Users\\zenmy\\PycharmProjects\\pythonProject\\venv\\lib\\site-packages']
Server time: Thu, 02 Jun 2022 06:26:36 +0000
urls.py
from django.urls import path
from .views import MovieList, MovieDetail, MovieCategory, MovieLanguage, MovieSearch, MovieYear
from . import views
app_name = 'movie'
urlpatterns = [
path('', MovieList.as_view(), name='movie_list'),
path('search/', MovieSearch.as_view(), name='movie_search'),
path('category/<str:category>', MovieCategory.as_view(), name='movie_category'),
path('language/<str:lang>', MovieLanguage.as_view(), name='movie_language'),
path('year/<int:year>', MovieYear.as_view(), name='movie_year'),
path('<slug:slug>', MovieDetail.as_view(), name='movie_detail'),
path('<slug:slug>/add-comment/', views.add_comment, name='add-comment'),
]
models.py
class Movie(models.Model):
title = models.CharField(max_length=100)
description = models.TextField(max_length=1000)
image = models.ImageField(upload_to='movies')
banner = models.ImageField(upload_to='movies_banner', blank=True)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=10)
language = models.CharField(choices=LANGUAGE_CHOICES, max_length=10)
status = models.CharField(choices=STATUS_CHOICES, max_length=2)
cast = models.CharField(max_length=100)
year_of_production = models.DateField()
views_count = models.IntegerField(default=0)
movie_trailer = models.URLField()
created = models.DateTimeField(blank=True, default=timezone.now)
slug = models.SlugField(blank=True, null=True)
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.title)
super(Movie, self).save(*args, **kwargs)
def __str__(self):
return self.title
views .py
@login_required(login_url='/accounts/login')
def add_comment(request, pk):
movie = Movie.objects.get(id=pk)
form = CommentForm()
context = {
'form': form
}
return render(request, 'add_comment.html', context)
Согласно url в вашем urls.py
:
path('<slug:slug>/add-comment/', views.add_comment, name='add-comment')
Вам нужно отредактировать ваш вид следующим образом:
@login_required(login_url='/accounts/login')
def add_comment(request, slug): # We edited here: pk -> slug
movie = Movie.objects.get(slug=slug) # And we edited here: pk -> slug, twice.
form = CommentForm()
context = {
'form': form
}
return render(request, 'add_comment.html', context)
Теперь вам нужно подтвердить ваш slug и проверить, существует ли объект movie.
from django.http import Http404 # Don't forget this import!
@login_required(login_url='/accounts/login')
def add_comment(request, slug):
try:
movie = Movie.objects.get(slug=slug)
except Movie.DoesNotExist: # We catch exception and raise 404 error, it means that movie with that slug doesn't exist.
raise Http404
form = CommentForm()
context = {
'form': form
}
return render(request, 'add_comment.html', context)
P.S. Это не очень хорошая идея получить ваш фильм по полю, которое не является обязательным и не уникальным. Например, у вас есть два фильма с одинаковыми названиями и slug (которые генерируются из названий). Если вы передадите этот slug в url - вы получите MultipleObjectsReturned
исключение.