Profile Page for all Users blogs Django

Viewed 179

I'm building a blog site and each user has a profile that should list their written blogs. But I'm having problems making a reference to individual users. How can I iterate blogs for a defined user, and not self.request.user?

My Views

class ShowProfilePageView(LoginRequiredMixin, DetailView):
    model = UserProfile
    template_name= 'registration/user_profile.html'

    def get_context_data(self, *args, **kwargs):
        context = super(ShowProfilePageView, self).get_context_data(*args, **kwargs)
        page_user = get_object_or_404(UserProfile, id=self.kwargs['pk'])
        user = self.request.user
        user_posts = Post.objects.filter(author= user).order_by('-post_date')
        context['page_user'] = page_user
        context['user_posts'] = user_posts
        return context

Note: The user, defined in the view above is self.request.user and this makes all the user profiles list out the blogs of the current logged in user instead of been based on particular users.

Models

The Post/Blog model

class Post(models.Model):
    title = models.CharField(max_length=225)
    header_image = models.ImageField(blank= True, null=True, upload_to='images/header_image')
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = RichTextField(blank=True, null=True)
    post_date = models.DateField(auto_now_add = True)
    category = models.CharField(max_length=225)
    snippet = models.CharField(max_length=70)

UserProfile models

The user profile models

class UserProfile(models.Model):
    user = models.OneToOneField(User, null=True, on_delete = models.CASCADE)
    bio = models.TextField(max_length=160)
    profile_pic = models.ImageField(blank= True, null=True, upload_to='images/profile_pics')
    website_url = models.CharField(max_length=250, null = True, blank = True)
    twitter_url = models.CharField(max_length=250, null = True, blank = True)
    github_url = models.CharField(max_length=250, null = True, blank = True)
    linkedin_url = models.CharField(max_length=250, null = True, blank = True)
    dribble_url = models.CharField(max_length=250, null = True, blank = True)
    figma_url = models.CharField(max_length=250, null = True, blank = True)
    codepen_url = models.CharField(max_length=250, null = True, blank = True)
    facebook_url = models.CharField(max_length=250, null = True, blank = True)
    instagram_url = models.CharField(max_length=250, null = True, blank = True)

Urls

The Profile page url

path('<int:pk>/profile/', ShowProfilePageView.as_view(), name='show_profile_page'),

Template

% for post in user_posts %}
                    <div class="col-md-6">
                        <div class="row g-0 border rounded overflow-hidden flex-md-row mb-4 shadow-sm h-md-250 position-relative">
                          <div class="col p-4 d-flex flex-column position-static">
                            <strong class="d-inline-block mb-2 text-success"><a href="{% url 'category' post.category %}">{{ post.category}}</a></strong>
                            <h3 class="mb-0"><a href="{% url 'blog_detail' post.pk %}">{{ post.title }}</a></h3>
                            <div class="mb-1 text-muted">{{ post.post_date}}</div>
                            <p style="margin-top: 12px;" class="mb-auto">{{post.snippet}}</p>  
                    </div>
                    {% if post.header_image %}
                      <img class="rounded float-right" style="width: 200px;" src="{{ post.header_image.url }}" alt="blog-header-image">                       
                    {% endif %} 
                      </div>
                  </div>
        {% endfor %}
1 Answers

You have access to user from user profile, so you can just use that to get all the posts from the profile.

In that case you can use page_user.user as the author:

page_user = get_object_or_404(UserProfile, id=self.kwargs['pk'])
user_posts = Post.objects.filter(author=page_user.user).order_by('-post_date')
Related