Я застрял при доступе к шаблону DetailView в Django

urls.py

urlpatterns = [
    path('',CourseList.as_view(),name='course_list'),
    path('create/',CourseCreate.as_view(),name='course_create'),
    path('<int:cid>/',CourseView.as_view(),name='course_view'),
]

views.py

COURSE_PERM_GUEST = 0
COURSE_PERM_STUDENT = 1
COURSE_PERM_TEACHER = 2
COURSE_PERM_MEMBER = 3

class CourseAccessMixin(AccessMixin):
    permission = None
    extra_context = {}
    def dispatch(self,request,*args,**kwargs):
        if not request.user.is_authenticated:
            return super().handle_no_permission()

        self.course = get_object_or_404(Course,id=kwargs['cid'])

        user_perm = COURSE_PERM_GUEST
        if self.course.teacher == request.user:
            user_perm = COURSE_PERM_TEACHER
        elif self.course.enroll_set.filter(student=request.user).exists():
            user_perm = COURSE_PERM_STUDENT

        if not request.user.is_superuser and self.permission is not None:
            is_accessible = False
            if self.permission == COURSE_PERM_GUEST and \
               user_perm == COURSE_PERM_GUEST:
                is_accessible = True
            elif (self.permission & user_perm) != 0:
                is_accessible = True

            if not is_accessible:
                return super().handle_no_permission()

            self.extra_context.update({'course':self.course})
            return super().dispatch(request,*args,**kwargs)

class CourseView(CourseAccessMixin,DetailView):
    extra_context = {'title':'檢視課程'}
    model = Course
    pk_url_kwarg = 'cid'

models.py

class Course(models.Model):
    name = models.CharField('課程名稱',max_length=50)
    enroll_password = models.CharField('選課密碼',max_length=50)
    teacher = models.ForeignKey(User,models.CASCADE)

    def __str__(self):
        return '{}#{} ({})'.format(
            self.id,
            self.name,
            self.teacher.first_name)

course_list.html

{% extends "base.html" %} 
{% load user_tags %} 

{% block content %} 
{% if user|is_teacher %} 
<div class="mb-2">
    <a href="{% url 'course_create' %}" class="btn btn-sm btn-primary">建立課程</a>
</div>
{% endif %} 
<div id="course_list">
    {% for course in course_list %} 
    <div class="list-group">
        <div class="list-group-item d-flex">
            {% if user.is_authenticated %} 
            <a href="{% url 'course_view' course.id %}">{{ course.name }}</a>
            {% else %} 
            {{ course.name }}
            {% endif %} 
            <small class="ml-auto">{{ course.teacher.first_name }} 老師</small>
        </div>
    </div>
    {% endfor %} 
</div>
{% include 'pagination.html' %}
{% endblock %} 

course_detail.html

{% extends 'base.html' %} 

{% load user_tags %} 

{% block content %} 
<div id="course_view" class="card">
    {% with b1 = "btn btn-sm btn-primary" b2 = "btn btn-sm btn-secondary" %} 
    <div class="card-header d-flex">
        <div>
            <a href="{% url 'course_view' course.id %}">{{ course.name }}</a>
            <small>{{ course.teacher.first_name }} 老師</small>
        </div>
        {% if user.is_superuser or course.teacher == user %} 
        <div class="ml-auto">
            <span class="badge badge-light">
                選課密碼: {{ course.enroll_password }}
            </span>
            <a href="{% url 'course_edit' course.id %}" class="{{ b1 }}">
                <i class="fas fa-edit"></i>編輯
            </a>
        </div>
        {% endif %} 
    </div>
    <div class="card-body">
        {% block course_detail_body %} 
        <div id="student_op" class="btn-group">
            {% if not course|has_member:user and not user.is_superuser %} 
            <a href="{% url 'course_enroll' course.id %}" class="{{ b1 }}">
                <i class="fas fa-id-badge"></i>選修
            </a>
            {% else %} 
            <a href="{% url 'course_users' course.id %}" class="{{ b1 }}">
                <i class="fas fa-users"></i>修課名單
            </a>
                {% if course|has_student:user %} 
                <a href="{% url 'course_seat' course.id %}" class="{{ b1 }}">
                    <i class="fas fa-chair"></i>更改座號
                </a>
                {% endif %} 
            {% endif %} 
        </div>
        {% endblock %} 
    </div>
    {% endwith %} 
</div>
{% endblock %} 

Ошибка:

ValueError at /course/1/
The view course.views.CourseView didn't return an HttpResponse object. It returned None instead.

У меня есть представление CourseView, и когда я пытаюсь получить доступ к деталям соответствующего курса, щелкнув по гиперссылке <a href="{% url 'course_view' course.id %}">{{ course.name }}</a> из шаблона course_list.html, я получаю сообщение об ошибке, показывающее, что оно не возвращает объект HttpResponse. Я не знаю, чего не хватает для того, чтобы детали были доступны, даже если я установил pk_url_kwarg?

Вы забыли добавить return super().dispatch(request,*args,**kwargs) и конец функции dispatch (вы добавляете его, только в условии if)

измените это

            self.extra_context.update({'course':self.course})
            return super().dispatch(request,*args,**kwargs)

К этому:

            self.extra_context.update({'course':self.course})
            return super().dispatch(request,*args,**kwargs)
        return super().dispatch(request,*args,**kwargs)
Вернуться на верх