TypeError: Cannot create a consistent method resolution in django

Viewed 368

I am learning django through the 'Django 3 by example' book, and right now i am trying to build an e - learning platform. But, I am getting a weird error in my views.py file.

Here is my views file:

from django.views.generic.list import ListView
from django.urls import reverse_lazy
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from .models import Course


class ManageCourseListView(ListView):
    model = Course
    template_name = 'educa/manage/educa/list.html'
    permission_required = 'educa.view_course'

    def get_queryset(self):
        qs = super().get_queryset()
        return qs.filter(owner=self.request.user)


class OwnerMixin(object):
    def get_queryset(self):
        qs = super().get_queryset()
        return qs.filter(owner=self.request.owner)


class OwnerEditMixin(object):
    def form_valid(self, form):
        form.instance.onwer = self.request.user
        return super().form_valid(form)


class OwnerCourseMixin(object, LoginRequiredMixin, PermissionRequiredMixin):
    model = Course
    fields = ['subject', 'title', 'slug', 'overview']
    success_url = reverse_lazy('manage_course_list')


class OwnerCourseEditMixin(OwnerCourseMixin, OwnerEditMixin):
    template_name = 'educa/manage/course/list.html'


class CourseCreateView(OwnerEditMixin, CreateView):
    permission_required = 'educa.add_course'


class CourseUpdateView(OwnerCourseEditMixin, UpdateView):
    permission_required = 'educa.change_course'


class CourseDeleteView(OwnerCourseMixin, DeleteView):
    template_name = 'educa/manage/course/delete.html'
    permission_required = 'educa.delete_course'

The error is on line 30. Here is the full error message:

Exception in thread django-main-thread:
Traceback (most recent call last):
  File "C:\Users\Padma Jain\AppData\Local\Programs\Python\Python38\lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "C:\Users\Padma Jain\AppData\Local\Programs\Python\Python38\lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\utils\autoreload.py", line 53, in wrapper
    fn(*args, **kwargs)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\core\management\commands\runserver.py", line 118, in inner_run
    self.check(display_num_errors=True)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\core\management\base.py", line 392, in check
    all_issues = checks.run_checks(
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\core\checks\registry.py", line 70, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\core\checks\urls.py", line 13, in check_url_config
    return check_resolver(resolver)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\core\checks\urls.py", line 23, in check_resolver
    return check_method()
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\urls\resolvers.py", line 408, in check
    for pattern in self.url_patterns:
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\urls\resolvers.py", line 589, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\utils\functional.py", line 48, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\urls\resolvers.py", line 582, in urlconf_module
    return import_module(self.urlconf_name)
  File "C:\Users\Padma Jain\AppData\Local\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\Padma Jain\Desktop\django\educa\elearn\elearn\urls.py", line 24, in <module>
    path('course/',include('educa.urls')),
  File "C:\Users\Padma Jain\Desktop\django\educa\venv\lib\site-packages\django\urls\conf.py", line 34, in include
    urlconf_module = import_module(urlconf_module)
  File "C:\Users\Padma Jain\AppData\Local\Programs\Python\Python38\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "C:\Users\Padma Jain\Desktop\django\educa\elearn\educa\urls.py", line 2, in <module>
    from .views import *
  File "C:\Users\Padma Jain\Desktop\django\educa\elearn\educa\views.py", line 30, in <module>
    class OwnerCourseMixin(object, LoginRequiredMixin, PermissionRequiredMixin):
TypeError: Cannot create a consistent method resolution
order (MRO) for bases object, LoginRequiredMixin, PermissionRequiredMixin

And just if it is required, here is the urls.py file of the educa application:

from django.urls import path
from .views import *

urlpatterns = [
    path('mine/',ManageCourseListView.as_view(),name='manage_course_list'),
    path('create/',CourseCreateView.as_view(),name='course_create'),
    path('<pk>/edit/',CourseUpdateView.as_view(),name='course_edit'),
    path('<pk>/delete/',CourseDeleteView.as_view(),name='course_delete'),
]

This is my first time building such a large application. Can someone please tell where I'm wrong?

EDIT: I solved this problem by editing line 30 of my views.py file from this:

class OwnerCourseMixin(object, LoginRequiredMixin, PermissionRequiredMixin):
   ....

to this:

class OwnerCourseMixin(OwnerMixin, LoginRequiredMixin, PermissionRequiredMixin):
    ....
1 Answers

In Python, every class inherits from a built-in basic class called object.

Your OwnerCourseMixin is inheriting from object and some other class. Because the other class(es), in this case, LoginRequiredMixin and PermissionRequiredMixin, already inherit from object, Python now cannot determine what class to look methods up on first.

You don't need to inherit from object here.

class OwnerCourseMixin(LoginRequiredMixin, PermissionRequiredMixin):
    model = Course
    fields = ['subject', 'title', 'slug', 'overview']
    success_url = reverse_lazy('manage_course_list')

That should work.

Related