我想打开下一个和上一个课程的课程详细信息,但我的尝试不起作用,我得到一个404错误,当我删除尝试,除了我得到'QuerySet'对象没有属性错误,并说错误是从计数_视图
enter image description here
views.py:
def course_detail(request,id):
try:
course = Courses.objects.get(id=id)
id_list = []
course = Courses.objects.filter(status = True)
for cr in course :
id_list.append(cr.id)
if id_list[0] == id:
next_course = Courses.objects.get(id=id_list[1])
previous_course =None
elif id_list[-1] == id:
next_course = None
previous_course = Courses.objects.get(id=id_list[-2])
else:
next_course = Courses.objects.get(id=id_list[id_list.index(id)+1])
previous_course = Courses.objects.get(id=id_list[id_list.index(id)-1])
course.counted_views += 1
course.save()
context = {
'course': course,
'next_course': next_course,
'previous_course': previous_course,
}
return render(request,"courses/course-details.html",context=context)
except:
return render(request,'courses/404.html')
urls.py:
from django.urls import path
from .views import *
app_name = 'course'
urlpatterns = [
path('',Maincourse,name='courses'),
path('category/<str:cat>',Maincourse,name='course_cat'),
path('teacher/<str:teacher>',Maincourse,name='course_teacher'),
path('search/',Maincourse,name='course_search'),
path('course_detail/<int:id>',course_detail,name='course_detail'),
]
models.py:
class Courses(models.Model):
title = models.CharField(max_length=40)
content = models.TextField(max_length=1000)
teacher = models.ForeignKey(Trainer,on_delete=models.CASCADE)
price = models.IntegerField(default=0)
image = models.ImageField(upload_to='courses',default='default.jpg')
category = models.ManyToManyField(Category)
counted_views = models.IntegerField(default=0)
counted_likes = models.IntegerField(default=0)
status = models.BooleanField(default=False)
created_date = models.DateTimeField(auto_now_add = True)
updated_date = models.DateTimeField(auto_now = True)
available_seats = models.IntegerField(default = 0)
schedule = models.DateTimeField(default=datetime.datetime.now())
2条答案
按热度按时间slmsl1lt1#
你已经声明了一个变量
course
,它最初获取一个对象,然后将其重新分配给一个查询集,这个查询集现在不再是一个对象,而是一个对象列表。您可以从以下位置编辑此行:收件人:
顺便说一下,按照惯例,模型以单数命名,因此
Course
而不是Courses
。hwazgwia2#
Django filter()方法返回一个queryset(匹配对象的列表),而get()方法返回单个(匹配)对象,如果没有找到则返回404。
如前所述,您首先将变量'course'分配给get()方法,该方法可能没有找到任何匹配的结果-因此出现404错误。
然后将相同的变量'course'赋值给filter()方法,返回第一个定义。
因为查询集返回一个对象列表或一个空列表,所以不能在“示例”列表上调用示例(列表中的单个对象)方法。
一个可能的解决方案是使用filter()方法,然后使用exists()检查它是否返回空查询集。然后,您可以使用first()获取查询集中的第一个项或传入所需的筛选参数。参见下面的示例。
另外,请注意@Nick已经指出的命名约定