I’m designing a Django app and experiencing an error message:
AttributeError at / 'function' object has no attribute 'objects' Request Method: GET Request URL: http://127.0.0.1:8000/ Django Version: 2.2.10 Exception Type: AttributeError Exception Value: 'function' object has no attribute 'objects'
This is my views.py that generates the message:
from django.shortcuts import render
from post.models import posts
def index(request):
featured = Post.objects.filter(featured=True)
context = {
'object_list': featured
}
return render(request, 'index.html', context)
def blog(request):
return render(request, 'blog.html', {})
def Post(request):
return render(request, 'post.html', {})`
and this is my model.py
from django.db import models
from django.contrib.auth import get_user_model
user = get_user_model()
class author(models.Model):
user = models.OneToOneField(user, on_delete=models.CASCADE)
profile_picture = models.ImageField
class category(models.Model):
title = models.CharField(max_length=20)
def __str__(self):
return self.title
class posts(models.Model):
title = models.CharField(max_length=100)
overview = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
comment_count = models.IntegerField(default=0)
author = models.ForeignKey(author, on_delete=models.CASCADE)
thumbnail = models.ImageField()
categories = models.ManyToManyField(category)
featured = models.BooleanField()
def __str__(self):
return self.title
Thanks for any help.
Advertisement
Answer
You wrote a view function named Post, hence Post.objects refers to the Post function, not the model. You furthermore named your model posts, instead of Post. I strongly advise to rename your model to Post, since Django models are normally singular, and written in PerlCase:
from django.shortcuts import render
from post.models import posts
def index(request):
featured = posts.objects.filter(featured=True)
context = {
'object_list': featured
}
return render(request, 'index.html', context)
def blog(request):
return render(request, 'blog.html', {})
def post(request):
return render(request, 'post.html', {})Of course then you should rename the variables accordingly.