Faz
Faz

Reputation: 108

Django user posts to be filtered from all posts and displayed in user profile

I am new to Python and Django and now developing a blog.I have this model that users can log in to the site and add their posts and all posts are displayed in home. At the same time I want the posts by the user to be displayed in user profile.

My model for the blogpost is

from django.db import models
from django.utils import timezone

class Blogpost(models.Model):
    author = models.ForeignKey('auth.User')
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

def publish(self):
    self.published_date = timezone.now()
    self.save()

def __str__(self):
    return self.title

and the views.py:

views.py    

from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from blogpost.models import Blogpost

def home(request):
    context = {}
    template = 'home.html'
    return render(request,template,context)

def about(request):
    context = {}
    template = 'about.html'
    return render(request,template,context)

@login_required(login_url='/accounts/login/')
def userprofile(request):
    user = request.user
    context = {'user': user}
    user_posts=Blogpost.objects.filter(author=request.user).order_by('-published_date')
    template = 'profile.html'
    return render(request,template,context,{'user_posts':user_posts})

I am using this template to display the posts from users returned by the query set.

profile.html

{% extends 'base.html' %}
{% load staticfiles %}

{% block blogprofile %}

        {{ user.username }}
        {{ user.email }}

    {% for Blogpost in user_posts %}
            <div class="post">

                <div class="date">
                    <p>{{ Blogpost.published_date }}</p>
                    <p>{{ Blogpost.author }}</p>
                </div>

                <h1><a href="{% url 'post_detail' pk=Blogpost.pk %}">{{ Blogpost.title }}</a></h1>
                <p>{{ Blogpost.text|linebreaksbr }}</p>

            </div>
    {% endfor %}

{% endblock %}

Now I am getting only user name and email when I open the profile.html where as the post is not getting retrieved. Can anyone please correct me on where I am making mistake.

Upvotes: 0

Views: 4680

Answers (1)

Exprator
Exprator

Reputation: 27503

Change your view to this:

@login_required(login_url='/accounts/login/')
def userprofile(request):
    user = request.user
    user_posts = Blogpost.objects.filter(author=request.user).order_by('-published_date')
    template = 'profile.html'
    return render(request, template, {'user_posts':user_posts,'user': user})

Upvotes: 3

Related Questions