I have these two models and as you can see they have a relationship.
class Post(models.Model):
    text = models.TextField()
class PostImage(models.Model):
    post = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
    image = models.FileField(upload_to = 'media/',blank=True, null=True)
As far as I understand if I query posts and push them to a template and post, I would expect to use something like this in my templates to retrieve the images URL attached to the posts but it doesn’t seem to work.
{% for post in posts %}
    {% for post_image in post.post_image_set.all %}
        {{post_image.image.url}}
    {% endfor %}
{% endfor %}
What am I doing wrong?
Here is my views.py file.
views.py
# Create your views here.
def index(request):
    posts=Post.objects.filter(approved=True).order_by('-published_date')
    context = {"posts":posts}
    return render(request, 'post/home.html',context)
Advertisement
Answer
The default related name for a foreign key relational is the name of the model (PostImage) but in your template for loop you called it post_image Following relationships “backward”
change
{% for post_image in post.post_image_set.all %}
into
{% for post_image in post.postimage_set.all %}
Template code (with change)
{% for post in posts %}
    {% for post_image in post.postimage_set.all %}
        {{post_image.image.url}}
    {% endfor %}
{% endfor %}
