Django: converting view function to class-based view. Error during login to Admin panel: matching query does not exist

I'm learning how to convert old view.py functions to class-based views.

I started with a simple function that displayed a page with my essays, plus, I had a newsletter form and a draft of a comment form (but not attached to DB). I decided to not develop this comment form further in a simple function, but to rebuild all of it to class-based view to learn a better and cleaner approach.

I've encountered a problem that I have no idea how to solve. Error: matching query does not exist. And Exception Value: EssayCls matching query does not exist. Most likely I break the logic that connects my model to my DB.

I'm looking for suggestions on how to solve issues in my code and suggestions about topics I should learn more about to make this kind of development less cumbersome.

Before I rebuild my view, things were working fine and looked like this:

views.py:

from django_user_agents.utils import get_user_agent
from .models import EssayCls, SendMeMessage
from .forms import CommentForm

def my_essays(request, home_view_author_slug):
    user_agent = get_user_agent(request)
    
    try:
        selected_essay = EssayCls.objects.get(slug=home_view_author_slug)
        if request.method == 'GET':
            user_feeDBack = UserFeeDBack()
            
        else:
            """
            The incoming request from Django will have
            a POST property which contains any submitted data
            that might be attached to incoming POST request.
            """
            user_feeDBack = UserFeeDBack(request.POST) 
            if user_feeDBack.is_valid():
                user_email = user_feeDBack.cleaned_data['email']
                send_me_message, was_created = SendMeMessage.objects.get_or_create(email=user_email)
                """
                Having a `user_email` object I can create a `send_me_message` by myself
                I will do so, because if I use the `send_me_message` model from models.py instead of this form
                then I won't have control over how it's created. Doing the line of code below,
                I have control over how it's created and I can check
                whether I have added an email before I try to create a new one in DB. 
                If I don't have an email in DB I can create a new instance in DB with the line:
                `send_me_message_new, _ = send_me_message.objects.get_or_create(email=user_email)`.
                I can write, also 
                send_me_message_new, was_created = send_me_message.objects.get_or_create(email=user_email)
                the flag `was_created` tells us whether a new entry was created or not.
                `_` ignore value: `was_created`.
                """

                selected_essay.guest.add(send_me_message)
                
                return redirect('confirm-registration', home_view_author_slug=home_view_author_slug)
        
        if user_agent.is_pc:        
            return render(
                request,
                'author_x_developer/article-content_pc_tablet.html', 
                {
                    'essay_found': True,
                    'essay_all': selected_essay,
                    'form': user_feeDBack,
                    'post_tags': selected_essay.tags.all(),
                    'comment_form': CommentForm()
                })

        if user_agent.is_mobile:        
            return render(
                request,
                'author_x_developer/article-content_mobile.html', 
                {
                    'essay_found': True,
                    'essay_all': selected_essay,
                    'form': user_feeDBack,
                    'post_tags': selected_essay.tags.all(),
                    'comment_form': CommentForm()
                })
        
        if user_agent.is_tablet:        
            return render(
                request,
                'author_x_developer/article-content_pc_tablet.html', 
                {
                    'essay_found': True,
                    'essay_all': selected_essay,
                    'form': user_feeDBack,
                    'post_tags': selected_essay.tags.all(),
                    'comment_form': CommentForm()
                })

    except Exception as exc:
        print('Exception error message:', exc) # Test

        if user_agent.is_pc:
            return render(
                request,
                'author_x_developer/article-content_pc_tablet.html', 
                {
                    'essay_found': False
                })
               

        elif user_agent.is_mobile:
            return render(
                request,
                'author_x_developer/article-content_mobile.html', 
                {
                    'essay_found': False
                })

        elif user_agent.is_tablet:
            return render(
                request,
                'author_x_developer/article-content_pc_tablet.html', 
                {
                    'essay_found': False
                })

models.py:

class Tag(models.Model):
    caption = models.CharField(max_length=100)
    
    def __str__(self):
        return self.caption

    class Meta:
        ordering = ['caption']


class EssayCls(models.Model):
    title = models.CharField(max_length=200)
    organizer_email = models.EmailField(null=True)
    date = models.DateField(null=True)
    slug  = models.SlugField(unique=True, DB_index=True)
    description = models.TextField(MinLengthValidator(10)) 
    details = models.TextField()
    image = models.ImageField(upload_to='images')

    video = models.ForeignKey(VideoObject, blank=True, null=True, on_delete=models.SET_NULL, related_name="video_obj") # One-to-many relationship
    language = models.ForeignKey(ProgLang, null=True, on_delete=models.SET_NULL) # One-to-many relationship
    guest = models.ManyToManyField(SendMeMessage, blank=True)
    tags = models.ManyToManyField(Tag)
    
    class Meta:
        verbose_name = "My Essay"
    
class Comment(models.Model):
    user_name = models.CharField(max_length=120)
    user_email = models.EmailField() 
    text = models.TextField(max_length=2300)
    post = models.ForeignKey(
                            EssayCls, 
                            on_delete=models.CASCADE, 
                            related_name="comments"
                            )

forms.py:

class UserFeeDBack(forms.Form):
    email = forms.EmailField(label='Your email') # 'Your email' is html label form templates.


class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        exclude = ["post"]
        labels = {
            "user_name": "Your name",
            "user_email": "Your email",
            "text": "Your Comment"
        }

After I hashed (in the views.py) my old function my_essays and convert it to class-based view MyEssaysView. At this point it looks like this:

from django_user_agents.utils import get_user_agent
from django.views import View
from django.http import HttpResponseRedirect
from django.urls import reverse

from .models import EssayCls, SendMeMessage, VideoObject 

from .forms import UserFeeDBack 

from .forms import CommentForm


class MyEssaysView(View):
    def get(self, request, home_view_author_slug):
        user_agent = get_user_agent(request)
        selected_essay = EssayCls.objects.get(slug=home_view_author_slug)
        
        if request.method == 'GET': 
            user_feeDBack = UserFeeDBack() 
            
        else:
            """
            The incoming request from Django will have
            a POST property which contains any submitted data
            that might be attached to incoming POST request.
            """
            user_feeDBack = UserFeeDBack(request.POST) 
            if user_feeDBack.is_valid():  
                user_email = user_feeDBack.cleaned_data['email']
                send_me_message, was_created = SendMeMessage.objects.get_or_create(email=user_email)
                """
                Having `user_email` object I can create a `send_me_message` by myself
                I will do so, because if I use `send_me_message` model from models.py instead of this form
                then I won't have control over how it's created. Doing the line of code below,
                I have control over how it's created and I can check
                whether I have added an email before I try to create a new one in DB. 
                If I don't have an email in DB I can create a new instance in DB with the line:
                `send_me_message_new, _ = send_me_message.objects.get_or_create(email=user_email)`.
                I can write, also 
                send_me_message_new, was_created = send_me_message.objects.get_or_create(email=user_email)
                the flag `was_created` tells us whether a new entry was created or not.
                `_` ignore value: `was_created`.
                """

                selected_essay.guest.add(send_me_message)
                
                return redirect('confirm-registration', home_view_author_slug=home_view_author_slug)

        context = {
            'essay_found': True,
            'essay_all': selected_essay,
            'post_tags': selected_essay.tags.all(),
            'form': user_feeDBack,
            "comment_form": CommentForm(),
            "user_feeDBack": UserFeeDBack()
        }
        return render(request, "author_x_developer/article-content_mobile.html", context)

    def post(self, request, home_view_author_slug):
        user_feeDBack = UserFeeDBack(request.POST)
        comment_form = CommentForm(request.POST)
        post = EssayCls.objects.get(slug=home_view_author_slug)

        if comment_form.is_valid():
          comment = comment_form.save(commit=False)
          comment.post = post
          comment.save()

          return HttpResponseRedirect(reverse("essay-path", args=[home_view_author_slug])) 

        context = {
          "post": post,
          "post_tags": post.tags.all(),
          "comment_form": comment_form
        }
        return render(request, "author_x_developer/article-content_mobile.html", context)

Error log:

DoesNotExist at /admin

EssayCls matching query does not exist.

Request Method:     GET
Request URL:    http://192.168.1.8:8000/admin
Django Version:     4.1.1
Exception Type:     DoesNotExist
Exception Value:    

EssayCls matching query does not exist.

Exception Location:     C:\Dev\my-page-author-x\venv\lib\site-packages\django\DB\models\query.py, line 650, in get
Raised during:  author_x_developer.views.MyEssaysView
Python Executable:  C:\Dev\my-page-author-x\venv\Scripts\python.exe
Python Version:     3.9.7
Python Path:    

['C:\\Users\\Dev\\my-page-author-x\\django_my_page_author_x',
 'C:\\Users\\b2b\\AppData\\Local\\Programs\\Python\\Python39\\python39.zip',
 'C:\\Users\\b2b\\AppData\\Local\\Programs\\Python\\Python39\\DLLs',
 'C:\\Users\\b2b\\AppData\\Local\\Programs\\Python\\Python39\\lib',
 'C:\\Users\\b2b\\AppData\\Local\\Programs\\Python\\Python39',
 'C:\\Users\\b2b\\Desktop\\Dev\\my-page-author-x\\venv',
 'C:\\Users\\b2b\\Desktop\\Dev\\my-page-author-x\\venv\\lib\\site-packages']

Server time:    Fri, 27 Jan 2023 02:44:12 +0100



Environment:


Request Method: GET
Request URL: http://192.168.1.8:8000/admin

Django Version: 4.1.1
Python Version: 3.9.7
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'embed_video',
 'author_x_developer',
 'debug_toolbar',
 'django_user_agents']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'debug_toolbar.middleware.DebugToolbarMiddleware',
 'django_user_agents.middleware.UserAgentMiddleware']



Traceback (most recent call last):
  
File "C:\Users\Dev\my-page-author-x\venv\lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
 
 File "C:\Users\Dev\my-page-author-x\venv\lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
 
 File "C:\Users\Dev\my-page-author-x\venv\lib\site-packages\django\views\generic\base.py", line 103, in view
    return self.dispatch(request, *args, **kwargs)
  
File "C:\Users\Dev\my-page-author-x\venv\lib\site-packages\django\views\generic\base.py", line 142, in dispatch
    return handler(request, *args, **kwargs)
 
 File "C:\Users\Dev\my-page-author-x\django_my_page_author_x\author_x_developer\views.py", line 86, in get
    selected_essay = EssayCls.objects.get(slug=home_view_author_slug)
 
 File "C:\Users\Dev\my-page-author-x\venv\lib\site-packages\django\DB\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
 
File "C:\Users\Dev\my-page-author-x\venv\lib\site-packages\django\DB\models\query.py", line 650, in get
    raise self.model.DoesNotExist(

Exception Type: DoesNotExist at /admin
Exception Value: EssayCls matching query does not exist.

Back to Top