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.