Тип объекта "Пост" не имеет атрибута "опубликовано" Джанго
Я работаю над приложением и пытаюсь показать похожие посты на основе тегов. У меня все работает нормально, но когда я загружаю подробный вид в браузере, я получаю сообщение об ошибке type object 'Post' has no attribute 'published'
Я разместил свои коды ниже.
Модель:
class Post(models.Model):
"""docstring for Post."""
STATUS_CHOICES = (
('drafts', 'Draft'),
('published', 'Published'), )
user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) #blank=True, null=True)#default=1
title = models.CharField(max_length = 120)
slug = models.SlugField(unique= True)
draft = models.BooleanField(default = False)
publish = models.DateField(auto_now=False, auto_now_add=False)
content = models.TextField()
tags = TaggableManager()
status = models.CharField(max_length=10,choices=STATUS_CHOICES, default='published')
updated = models.DateTimeField(auto_now=True, auto_now_add=False)
timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
Посмотреть:
def view(request, slug =None):
instance = get_object_or_404(Post, slug =slug)
if instance.draft or instance.publish > timezone.now().date():
redirect(index)
#content_type = ContentType.objects.get_for_model(Post)
#obj_id = instance.id
initial_data = {
"content_type": instance.get_content_type,
"object_id": instance.id
}
form = CommentForm(request.POST or None, initial=initial_data)
if form.is_valid():
#print (form.cleaned_data)
c_type = form.cleaned_data.get("content_type")
content_type = ContentType.objects.get(model= c_type)
obj_id = form.cleaned_data.get("object_id")
c_content =form.cleaned_data.get("content")
parent_obj = None
try:
parent_id = int(request.POST.get("parent_id"))
except Exception as e:
parent_id = None
if parent_id:
parent_query = Comment.objects.filter(parent__id= parent_id)
if parent_query.exists():
parent_obj = parent_query.first()
new_comment, created = Comment.objects.get_or_create(
user = request.user,
content_type = content_type,
object_id = obj_id,
content = c_content,
parent = parent_obj,
)
return HttpResponseRedirect(new_comment.content_object.get_absolute_url())
comments = instance.comments
# List of similar posts
post_tags_ids = instance.tags.values_list('id', flat=True)
similar_posts = Post.published.filter(tags__in=post_tags_ids).exclude(id=instance.id)
similar_posts = similar_posts.annotate(same_tags=Count('tags')).order_by('-same_tags','-publish')[:4]
context = {
#"objects": query,
"instance": instance,
"comments": comments,
"form": form,
'similar_posts': similar_posts
}
template = 'view.html'
return render(request,template,context)
дополнительные коды будут добавлены по запросу. Заранее спасибо.
2 ответа
Решение
Если я правильно понимаю, тогда у вас есть опечатка
similar_posts = Post.published.filter(tags__in=post_tags_ids)
.exclude(id=instance.id)
Строка выше должна быть
similar_posts = Post.objects.filter(tags__in=post_tags_ids)
.exclude(id=instance.id)
Также, если вы имели в виду использовать поле publish
тогда он может использоваться только в аргументах набора запросов, а не в качестве атрибута связанного объекта
Добавьте следующие атрибуты в
Post
класс:
class Post(models.Model):
# ...
objects = models.Manager() # The default manager.
published = PublishedManager() # Our custom manager.
а также
posts = Post.published.all()