demyr
demyr

Reputation: 59

Django - List blog posts in another view

I have got two Models: Member and Blog whic is called MyPosts. I have got a Member Detail page which looks like a Facebook profile page and I want to list user's posts there. How can I do that?

My Member Model:

class Member(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='members')
member_name = models.CharField(max_length=120)
member_adress = models.CharField(max_length=200)
.
.
slug = models.SlugField(max_length=140, unique=True)
etc. 

    def __str__(self):
    return self.member_name

def get_absolute_url(self):
    return reverse('memberships:dashboard')

def _get_unique_slug(self):
    slug = slugify(self.member_name)
    unique_slug = slug
    num = 1
    while Member.objects.filter(slug=unique_slug).exists():
        unique_slug = '{}-{}'.format(slug, num)
        num += 1
    return unique_slug

def save(self, *args, **kwargs):
    if not self.slug:
        self.slug = self._get_unique_slug()
    super().save()

My Blog Model:

class MyPosts(models.Model):
user = models.ForeignKey(Member, on_delete=models.CASCADE, blank=False, null=True, related_name='postcreator')
title = models.CharField(max_length=120)
content = models.TextField(max_length=240)
publishing_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True)
slug = models.SlugField(max_length=140, unique=True, blank=False, null=True)

def __str__(self):
    return self.title

class Meta:
    ordering = ['-publishing_date', 'id']

My Detail Page View:

def MemberDetailView(request,pk, slug):
try:
    infos = Member.objects.get(pk=pk, slug=slug)
except Member.DoesNotExist:
    raise Http404("Member does not exist")
post_list = MyPosts.objects.filter(user=self.request.user.id) # this gives a self error


return render(request, 'directory/member-detail.html', {'memberinfo':infos}, {'memberposts':post_list} )

How can I add my post view there to see them on the same "member-detail" page?

Upvotes: 1

Views: 179

Answers (1)

Alasdair
Alasdair

Reputation: 308909

There are two issues with your view.

Firstly, MemberDetailView is a view function, not a class based view. Therefore you should use request, not self.request. You can simplify request.user.id to request.user.

Secondly, when you call render, the context should go in a single dictionary.

def MemberDetailView(request, pk, slug):
    try:
        infos = Member.objects.get(pk=pk, slug=slug)
    except Member.DoesNotExist:
        raise Http404("Member does not exist")
    post_list = MyPosts.objects.filter(user=request.user)
    return render(request, 'directory/member-detail.html', {'memberinfo':infos, 'memberposts':post_list})

If you want to improve the view further, I recommend renaming it to member_detail_view to match the PEP8 style guide for function names. You can also use get_object_or_404 to simplify the code:

from django.shortcuts import get_object_or_404

def member_detail_view(request, pk, slug):
    infos = get_object_or_404(Member, pk=pk, slug=slug)
    post_list = MyPosts.objects.filter(user=request.user)
    return render(request, 'directory/member-detail.html', {'memberinfo':infos, 'memberposts':post_list})

Upvotes: 3

Related Questions