我正在嘗試在 slug:slug url 頂部添加另一個 html 網頁,它會引發錯誤.. 我不知道這里出了什么問題。
已經嘗試了我能想到的一切并且在放棄的邊緣,這里有人可以幫忙嗎?:)
錯誤資訊 :
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
網址.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'),
]
模型.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
視圖.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)
uj5u.com熱心網友回復:
根據您的網址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 并檢查電影物件是否存在。
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)
PS 按欄位獲取電影不是一個好主意,這不是必需的,也不是唯一的。例如,您有兩部電影具有相同的標題和 slug(由標題生成)。如果你將這個 slug 傳遞給 url - 你會得到MultipleObjectsReturned例外。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/485273.html
