Why do I face this problem? I am trying to get the tags from the Post table.Post and tags are two tables with Many to Many relation.
in models.py
class Tag(models.Model):
caption = models.CharField(max_length=40)
class Post(models.Model):
tags = models.ManyToManyField(Tag)
in views
def post_details(request,slug):
post = Post.objects.get(slug=slug)
tags = Post.objects.filter(tags)
comment = post.comments.all()
return render (request,'mblog/post_detail.html',{'post': post ,'tags': tags,'comment': comment})
CodePudding user response:
You probably want to replace
tags = Post.objects.filter(tags)
with simply
tags = post.tags
CodePudding user response:
The tags = Post.objects.filter(
makes no sense: you are filtering tags)Post
objects, not Tag
objects, and you are using a variable named tags
before that variable is even assigned. You probably want to use post.tags.all()
:
from django.shortcuts import get_object_or_404
def post_details(request, slug):
post = get_object_or_404(Post, slug=slug)
tags = post.tags.all()
comment = post.comments.all()
return render(
request,
'mblog/post_detail.html',
{'post': post, 'tags': tags, 'comment': comment},
)
Note: It is often better to use
get_object_or_404(…)
[Django-doc], then to use.get(…)
[Django-doc] directly. In case the object does not exists, for example because the user altered the URL themselves, theget_object_or_404(…)
will result in returning a HTTP 404 Not Found response, whereas using.get(…)
will result in a HTTP 500 Server Error.
CodePudding user response:
You need to initialize the tags variable before accessing it.
Try this code:
tags = Tag.objects.all()
posts = tags.Post.all()